bitkeeper revision 1.717 (402a69d0603eYoV240buOqj3mgegjA)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Wed, 11 Feb 2004 17:43:44 +0000 (17:43 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Wed, 11 Feb 2004 17:43:44 +0000 (17:43 +0000)
Many files:
  Move everything except the Python toolset to 64-bit domain identifiers.
.del-block.c~add8486d96ee5b5f:
  Delete: xen/common/block.c

45 files changed:
.rootkeys
tools/xc/lib/xc.h
tools/xc/lib/xc_bvtsched.c
tools/xc/lib/xc_domain.c
tools/xc/lib/xc_linux_build.c
tools/xc/lib/xc_linux_restore.c
tools/xc/lib/xc_linux_save.c
tools/xc/lib/xc_netbsd_build.c
tools/xc/lib/xc_private.h
tools/xc/lib/xc_vbd.c
tools/xc/lib/xc_vif.c
tools/xc/py/Xc.c
xen/arch/i386/i387.c
xen/arch/i386/pdb-stub.c
xen/arch/i386/process.c
xen/arch/i386/smpboot.c
xen/arch/i386/traps.c
xen/common/block.c [deleted file]
xen/common/debug-linux.c
xen/common/debug.c
xen/common/dom0_ops.c
xen/common/domain.c
xen/common/kernel.c
xen/common/keyhandler.c
xen/common/network.c
xen/common/schedule.c
xen/drivers/block/xen_block.c
xen/include/asm-i386/i387.h
xen/include/asm-i386/pdb.h
xen/include/hypervisor-ifs/block.h
xen/include/hypervisor-ifs/dom0_ops.h
xen/include/hypervisor-ifs/hypervisor-if.h
xen/include/hypervisor-ifs/network.h
xen/include/hypervisor-ifs/vbd.h
xen/include/xeno/sched.h
xen/include/xeno/vif.h
xen/net/dev.c
xenolinux-2.4.24-sparse/arch/xeno/drivers/dom0/vfr.c
xenolinux-2.4.24-sparse/arch/xeno/drivers/network/network.c
xenolinux-2.4.24-sparse/arch/xeno/kernel/head.S
xenolinux-2.4.24-sparse/arch/xeno/kernel/ioport.c
xenolinux-2.4.24-sparse/arch/xeno/kernel/process.c
xenolinux-2.4.24-sparse/arch/xeno/kernel/setup.c
xenolinux-2.4.24-sparse/arch/xeno/kernel/time.c
xenolinux-2.4.24-sparse/include/asm-xeno/keyboard.h

index a487b18871e67e4779d25fbbf28b6b5782879003..227493e4105f353ec3a105edefbf86fb98f3df55 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 3ddb79bcOMCu9-5mKpjIh5d0qqBDPg xen/arch/i386/xeno.lds
 3ddb79bdff-gj-jFGKjOejeHLqL8Lg xen/common/Makefile
 3e397e66AyyD5fYraAySWuwi9uqSXg xen/common/ac_timer.c
-3ddb79bddEYJbcURvqqcx99Yl2iAhQ xen/common/block.c
 3ddb79bdrqnW93GR9gZk1OJe1qK-iQ xen/common/brlock.c
 3fb10d07GscSWPKxBqpvNfU-dYfa0g xen/common/console.c
 4022a73c_BbDFd2YJ_NQYVvKX5Oz7w xen/common/debug-linux.c
index 290d69649a59fe5626a7aa87e62eb362f994db62..11252852c016c65d28e1fbdb0df0a5443d467e4f 100644 (file)
@@ -9,12 +9,21 @@
 #ifndef __XC_H__
 #define __XC_H__
 
+typedef unsigned char      u8;
+typedef unsigned short     u16;
+typedef unsigned long      u32;
+typedef unsigned long long u64;
+typedef signed char        s8;
+typedef signed short       s16;
+typedef signed long        s32;
+typedef signed long long   s64;
+
 /* Obtain or relinquish a handle on the 'xc' library. */
 int xc_interface_open(void);
 int xc_interface_close(int xc_handle);
 
 typedef struct {
-    unsigned int  domid;
+    u64           domid;
     unsigned int  cpu;
     int           has_cpu;
     int           stopped;
@@ -26,44 +35,46 @@ typedef struct {
 
 int xc_domain_create(int xc_handle, 
                      unsigned int mem_kb, 
-                     const char *name);
+                     const char *name,
+                     u64 *pdomid);
 int xc_domain_start(int xc_handle, 
-                    unsigned int domid);
+                    u64 domid);
 int xc_domain_stop(int xc_handle, 
-                   unsigned int domid);
+                   u64 domid);
 int xc_domain_destroy(int xc_handle, 
-                      unsigned int domid, 
+                      u64 domid, 
                       int force);
 int xc_domain_pincpu(int xc_handle,
-                     unsigned int domid,
+                     u64 domid,
                      int cpu);
 int xc_domain_getinfo(int xc_handle,
-                      unsigned int first_domid, 
+                      u64 first_domid, 
                       unsigned int max_doms,
                       xc_dominfo_t *info);
 
 int xc_linux_save(int xc_handle,
-                  unsigned int domid, 
+                  u64 domid, 
                   const char *state_file, 
                   int verbose);
 int xc_linux_restore(int xc_handle,
                      const char *state_file, 
-                     int verbose);
+                     int verbose,
+                     u64 *pdomid);
 int xc_linux_build(int xc_handle,
-                   unsigned int domid,
+                   u64 domid,
                    const char *image_name,
                    const char *ramdisk_name,
                    const char *cmdline);
 
 int xc_netbsd_build(int xc_handle,
-                    unsigned int domid,
+                    u64 domid,
                     const char *image_name,
                     const char *cmdline);
 
 int xc_bvtsched_global_set(int xc_handle,
                            unsigned long ctx_allow);
 int xc_bvtsched_domain_set(int xc_handle,
-                           unsigned int domid,
+                           u64 domid,
                            unsigned long mcuadv,
                            unsigned long warp,
                            unsigned long warpl,
@@ -80,21 +91,21 @@ typedef struct {
 } xc_vif_stats_t;
 
 int xc_vif_scheduler_set(int xc_handle,
-                         unsigned int domid, 
+                         u64 domid, 
                          unsigned int vifid,
                          xc_vif_sched_params_t *params);
 int xc_vif_scheduler_get(int xc_handle,
-                         unsigned int domid, 
+                         u64 domid, 
                          unsigned int vifid,
                          xc_vif_sched_params_t *params);
 int xc_vif_stats_get(int xc_handle,
-                     unsigned int domid, 
+                     u64 domid, 
                      unsigned int vifid,
                      xc_vif_stats_t *stats);
 
 typedef struct {
-#define XC_VBDDOM_PROBE_ALL (~0U)
-    unsigned int   domid;
+#define XC_VBDDOM_PROBE_ALL (~0ULL)
+    u64            domid;
     unsigned short vbdid;
 #define XC_VBDF_WRITEABLE (1<<0)
     unsigned long  flags;
@@ -108,32 +119,32 @@ typedef struct {
 } xc_vbdextent_t;
 
 int xc_vbd_create(int xc_handle,
-                  unsigned int domid, 
+                  u64 domid, 
                   unsigned short vbdid, 
                   int writeable);
 int xc_vbd_destroy(int xc_handle,
-                   unsigned int domid, 
+                   u64 domid, 
                    unsigned short vbdid);
 int xc_vbd_grow(int xc_handle,
-                unsigned int domid, 
+                u64 domid, 
                 unsigned short vbdid,
                 xc_vbdextent_t *extent);
 int xc_vbd_shrink(int xc_handle,
-                  unsigned int domid, 
+                  u64 domid, 
                   unsigned short vbdid);
 int xc_vbd_setextents(int xc_handle,
-                      unsigned int domid, 
+                      u64 domid, 
                       unsigned short vbdid,
                       unsigned int nr_extents,
                       xc_vbdextent_t *extents);
 int xc_vbd_getextents(int xc_handle,
-                      unsigned int domid, 
+                      u64 domid, 
                       unsigned short vbdid,
                       unsigned int max_extents,
                       xc_vbdextent_t *extents,
                       int *writeable);
 int xc_vbd_probe(int xc_handle,
-                 unsigned int domid,
+                 u64 domid,
                  unsigned int max_vbds,
                  xc_vbd_t *vbds);
 
index 5ea52224e92da6ed3bc4e484f54725e545a4874b..6dc532df1fff2a9b23fe73e9bd5abd31cf5dce9e 100644 (file)
@@ -18,7 +18,7 @@ int xc_bvtsched_global_set(int xc_handle,
 }
 
 int xc_bvtsched_domain_set(int xc_handle,
-                           unsigned int domid,
+                           domid_t domid,
                            unsigned long mcuadv,
                            unsigned long warp,
                            unsigned long warpl,
index 5601fb485cd3b48911b76535138d2c2c01f5e804..669138fd9b2aaced741ec50a5f97b02c055dc1d3 100644 (file)
@@ -10,7 +10,8 @@
 
 int xc_domain_create(int xc_handle,
                      unsigned int mem_kb, 
-                     const char *name)
+                     const char *name,
+                     domid_t *pdomid)
 {
     int err;
     dom0_op_t op;
@@ -20,14 +21,15 @@ int xc_domain_create(int xc_handle,
     strncpy(op.u.createdomain.name, name, MAX_DOMAIN_NAME);
     op.u.createdomain.name[MAX_DOMAIN_NAME-1] = '\0';
 
-    err = do_dom0_op(xc_handle, &op);
+    if ( (err = do_dom0_op(xc_handle, &op)) == 0 )
+        *pdomid = op.u.createdomain.domain;
 
-    return (err < 0) ? err : op.u.createdomain.domain;
+    return err;
 }    
 
 
 int xc_domain_start(int xc_handle,
-                    unsigned int domid)
+                    domid_t domid)
 {
     dom0_op_t op;
     op.cmd = DOM0_STARTDOMAIN;
@@ -37,7 +39,7 @@ int xc_domain_start(int xc_handle,
 
 
 int xc_domain_stop(int xc_handle, 
-                   unsigned int domid)
+                   domid_t domid)
 {
     dom0_op_t op;
     op.cmd = DOM0_STOPDOMAIN;
@@ -47,7 +49,7 @@ int xc_domain_stop(int xc_handle,
 
 
 int xc_domain_destroy(int xc_handle,
-                      unsigned int domid, 
+                      domid_t domid, 
                       int force)
 {
     dom0_op_t op;
@@ -58,8 +60,8 @@ int xc_domain_destroy(int xc_handle,
 }
 
 int xc_domain_pincpu(int xc_handle,
-                      unsigned int domid, 
-                      int cpu)
+                     domid_t domid, 
+                     int cpu)
 {
     dom0_op_t op;
     op.cmd = DOM0_PINCPUDOMAIN;
@@ -70,11 +72,12 @@ int xc_domain_pincpu(int xc_handle,
 
 
 int xc_domain_getinfo(int xc_handle,
-                      unsigned int first_domid,
+                      domid_t first_domid,
                       unsigned int max_doms,
                       xc_dominfo_t *info)
 {
-    unsigned int nr_doms, next_domid = first_domid;
+    unsigned int nr_doms;
+    domid_t next_domid = first_domid;
     dom0_op_t op;
 
     for ( nr_doms = 0; nr_doms < max_doms; nr_doms++ )
index 37ece2c7c95d3a9826f112dc04d8808a8d3c2c60..0071ddf94d525c893c8628b42a91f18825c04cde 100644 (file)
@@ -12,7 +12,7 @@
 #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
 #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
 
-static long get_tot_pages(int xc_handle, int domid)
+static long get_tot_pages(int xc_handle, domid_t domid)
 {
     dom0_op_t op;
     op.cmd = DOM0_GETDOMAININFO;
@@ -22,7 +22,7 @@ static long get_tot_pages(int xc_handle, int domid)
 }
 
 static int get_pfn_list(int xc_handle,
-                        int domid, 
+                        domid_t domid, 
                         unsigned long *pfn_buf, 
                         unsigned long max_pfns)
 {
@@ -96,7 +96,7 @@ static int copy_to_domain_page(int pm_handle,
 }
 
 static int setup_guestos(int xc_handle,
-                         int dom, 
+                         domid_t dom, 
                          gzFile kernel_gfd, 
                          gzFile initrd_gfd, 
                          unsigned long tot_pages,
@@ -282,7 +282,6 @@ static int setup_guestos(int xc_handle,
     start_info->mod_len     = initrd_len;
     start_info->nr_pages    = tot_pages;
     start_info->shared_info = shared_info_frame << PAGE_SHIFT;
-    start_info->dom_id      = dom;
     start_info->flags       = 0;
     strncpy(start_info->cmd_line, cmdline, MAX_CMD_LEN);
     start_info->cmd_line[MAX_CMD_LEN-1] = '\0';
@@ -313,7 +312,7 @@ static int setup_guestos(int xc_handle,
 }
 
 int xc_linux_build(int xc_handle,
-                   unsigned int domid,
+                   domid_t domid,
                    const char *image_name,
                    const char *ramdisk_name,
                    const char *cmdline)
index 44ebe3c9408a8c4feb18f9540021157bb1461df0..7afb239d91fee6299ea6ae450d44e6f622a96c2c 100644 (file)
@@ -19,7 +19,7 @@
     } while ( 0 )
 
 static int get_pfn_list(int xc_handle,
-                        int domain_id, 
+                        domid_t domain_id, 
                         unsigned long *pfn_buf, 
                         unsigned long max_pfns)
 {
@@ -103,11 +103,13 @@ static int checked_read(gzFile fd, void *buf, size_t count)
 
 int xc_linux_restore(int xc_handle,
                      const char *state_file,
-                     int verbose)
+                     int verbose,
+                     domid_t *pdomid)
 {
     dom0_op_t op;
     int rc = 1, i, j;
-    unsigned long mfn, pfn, dom = 0;
+    unsigned long mfn, pfn;
+    domid_t dom = 0;
     unsigned int prev_pc, this_pc;
     
     /* Number of page frames in use by this XenoLinux session. */
@@ -370,7 +372,6 @@ int xc_linux_restore(int xc_handle,
     p_srec = map_pfn(pm_handle, mfn);
     p_srec->resume_info.nr_pages    = nr_pfns;
     p_srec->resume_info.shared_info = shared_info_frame << PAGE_SHIFT;
-    p_srec->resume_info.dom_id      = dom;
     p_srec->resume_info.flags       = 0;
     unmap_pfn(pm_handle, p_srec);
 
@@ -470,7 +471,7 @@ int xc_linux_restore(int xc_handle,
     else
     {
         /* Success: print the domain id. */
-        verbose_printf("DOM=%ld\n", dom);
+        verbose_printf("DOM=%llu\n", dom);
     }
 
     if ( pm_handle >= 0 )
@@ -483,5 +484,8 @@ int xc_linux_restore(int xc_handle,
 
     gzclose(gfd);
 
-    return (rc == 0) ? dom : rc;
+    if ( rc == 0 )
+        *pdomid = dom;
+
+    return rc;
 }
index 42ed198a710c62d77876ac0db61f908085370cd6..62c4d379dda0d847c24544199ace5b8e0a66b131 100644 (file)
@@ -40,7 +40,7 @@
 
 static int check_pfn_ownership(int xc_handle, 
                                unsigned long mfn, 
-                               unsigned int dom)
+                               domid_t dom)
 {
     dom0_op_t op;
     op.cmd = DOM0_GETPAGEFRAMEINFO;
@@ -52,7 +52,7 @@ static int check_pfn_ownership(int xc_handle,
 #define GETPFN_ERR (~0U)
 static unsigned int get_pfn_type(int xc_handle, 
                                  unsigned long mfn, 
-                                 unsigned int dom)
+                                 domid_t dom)
 {
     dom0_op_t op;
     op.cmd = DOM0_GETPAGEFRAMEINFO;
@@ -75,7 +75,7 @@ static int checked_write(gzFile fd, void *buf, size_t count)
 }
 
 int xc_linux_save(int xc_handle,
-                  unsigned int domid, 
+                  domid_t domid, 
                   const char *state_file, 
                   int verbose)
 {
index f971546ef44ca92cf531f09379cd62458697f458..4da93b702366a86d895a2e15a06479ef64a8175e 100644 (file)
@@ -22,7 +22,7 @@ static int loadelfimage(gzFile, int, unsigned long *, unsigned long,
 #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
 #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
 
-static long get_tot_pages(int xc_handle, int domid)
+static long get_tot_pages(int xc_handle, domid_t domid)
 {
     dom0_op_t op;
     op.cmd = DOM0_GETDOMAININFO;
@@ -32,7 +32,7 @@ static long get_tot_pages(int xc_handle, int domid)
 }
 
 static int get_pfn_list(int xc_handle,
-                        int domid, 
+                        domid_t domid, 
                         unsigned long *pfn_buf, 
                         unsigned long max_pfns)
 {
@@ -75,7 +75,7 @@ static int send_pgupdates(int xc_handle, mmu_update_t *updates, int nr_updates)
 }
 
 static int setup_guestos(int xc_handle,
-                         int dom, 
+                         domid_t dom, 
                          gzFile kernel_gfd, 
                          unsigned long tot_pages,
                          unsigned long *virt_startinfo_addr, 
@@ -218,7 +218,6 @@ static int setup_guestos(int xc_handle,
     start_info->mod_len     = symtab_len;
     start_info->nr_pages    = tot_pages;
     start_info->shared_info = shared_info_frame << PAGE_SHIFT;
-    start_info->dom_id      = dom;
     start_info->flags       = 0;
     strncpy(start_info->cmd_line, cmdline, MAX_CMD_LEN);
     start_info->cmd_line[MAX_CMD_LEN-1] = '\0';
@@ -249,7 +248,7 @@ static int setup_guestos(int xc_handle,
 }
 
 int xc_netbsd_build(int xc_handle,
-                    unsigned int domid,
+                    domid_t domid,
                     const char *image_name,
                     const char *cmdline)
 {
index 84ce9350cfe39cf7a4163ab3ce7069796701b85d..f5e2c25247d1c27bda6714ffc0ea66b7e769cf90 100644 (file)
@@ -2,15 +2,6 @@
 #ifndef __XC_PRIVATE_H__
 #define __XC_PRIVATE_H__
 
-typedef unsigned char      u8;
-typedef unsigned short     u16;
-typedef unsigned long      u32;
-typedef unsigned long long u64;
-typedef signed char        s8;
-typedef signed short       s16;
-typedef signed long        s32;
-typedef signed long long   s64;
-
 #include <unistd.h>
 #include <stdio.h>
 #include <errno.h>
index e0fa580dafa9fdde71c92f07b5296d92dcbe4c95..76a0e6814dd681becf916e166d9faf6da7c71dd4 100644 (file)
@@ -10,7 +10,7 @@
 #include "xc_private.h"
 
 int xc_vbd_create(int xc_handle,
-                  unsigned int domid, 
+                  domid_t domid, 
                   unsigned short vbdid, 
                   int writeable)
 {
@@ -24,7 +24,7 @@ int xc_vbd_create(int xc_handle,
 
 
 int xc_vbd_destroy(int xc_handle,
-                   unsigned int domid, 
+                   domid_t domid, 
                    unsigned short vbdid)
 {
     block_io_op_t op; 
@@ -36,7 +36,7 @@ int xc_vbd_destroy(int xc_handle,
 
 
 int xc_vbd_grow(int xc_handle,
-                unsigned int domid, 
+                domid_t domid, 
                 unsigned short vbdid,
                 xc_vbdextent_t *extent)
 {
@@ -52,7 +52,7 @@ int xc_vbd_grow(int xc_handle,
 
 
 int xc_vbd_shrink(int xc_handle,
-                  unsigned int domid, 
+                  domid_t domid, 
                   unsigned short vbdid)
 {
     block_io_op_t op; 
@@ -64,7 +64,7 @@ int xc_vbd_shrink(int xc_handle,
 
 
 int xc_vbd_setextents(int xc_handle,
-                      unsigned int domid, 
+                      domid_t domid, 
                       unsigned short vbdid,
                       unsigned int nr_extents,
                       xc_vbdextent_t *extents)
@@ -110,7 +110,7 @@ int xc_vbd_setextents(int xc_handle,
 
 
 int xc_vbd_getextents(int xc_handle,
-                      unsigned int domid, 
+                      domid_t domid, 
                       unsigned short vbdid,
                       unsigned int max_extents,
                       xc_vbdextent_t *extents,
@@ -159,7 +159,7 @@ int xc_vbd_getextents(int xc_handle,
 
 
 int xc_vbd_probe(int xc_handle,
-                 unsigned int domid,
+                 domid_t domid,
                  unsigned int max_vbds,
                  xc_vbd_t *vbds)
 {
index 645be0762d744c62ef6208d67dcc5e6f89191f0d..c73e2dde72634d8f0f32b36d1a951ddbbab34ea1 100644 (file)
@@ -9,7 +9,7 @@
 #include "xc_private.h"
 
 int xc_vif_scheduler_set(int xc_handle,
-                         unsigned int domid, 
+                         domid_t domid, 
                          unsigned int vifid, 
                          xc_vif_sched_params_t *params)
 {
@@ -24,7 +24,7 @@ int xc_vif_scheduler_set(int xc_handle,
 
 
 int xc_vif_scheduler_get(int xc_handle,
-                         unsigned int domid, 
+                         domid_t domid, 
                          unsigned int vifid, 
                          xc_vif_sched_params_t *params)
 {
@@ -46,7 +46,7 @@ int xc_vif_scheduler_get(int xc_handle,
 
 
 int xc_vif_stats_get(int xc_handle,
-                     unsigned int domid, 
+                     domid_t domid, 
                      unsigned int vifid, 
                      xc_vif_stats_t *stats)
 {
index d1052efd938c743e1452d4cb683dd7c1fd6aa7dc..8e3f5f7dcbdefadc28a4dc896c9330808ebd416c 100644 (file)
@@ -24,6 +24,7 @@ static PyObject *pyxc_domain_create(PyObject *self,
 
     unsigned int mem_kb = 65536;
     char        *name   = "(anon)";
+    u64          dom;
     int          ret;
 
     static char *kwd_list[] = { "mem_kb", "name", NULL };
@@ -32,9 +33,10 @@ static PyObject *pyxc_domain_create(PyObject *self,
                                       &mem_kb, &name) )
         return NULL;
 
-    ret = xc_domain_create(xc->xc_handle, mem_kb, name);
-    
-    return PyInt_FromLong(ret);
+    if ( (ret = xc_domain_create(xc->xc_handle, mem_kb, name, &dom)) < 0 )
+        return PyLong_FromLong(ret);
+
+    return PyLong_FromUnsignedLongLong(dom);
 }
 
 static PyObject *pyxc_domain_start(PyObject *self,
@@ -43,12 +45,12 @@ static PyObject *pyxc_domain_start(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int dom;
-    int          ret;
+    u64 dom;
+    int ret;
 
     static char *kwd_list[] = { "dom", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list, &dom) )
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "L", kwd_list, &dom) )
         return NULL;
 
     ret = xc_domain_start(xc->xc_handle, dom);
@@ -62,12 +64,12 @@ static PyObject *pyxc_domain_stop(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int dom;
-    int          ret;
+    u64 dom;
+    int ret;
 
     static char *kwd_list[] = { "dom", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list, &dom) )
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "L", kwd_list, &dom) )
         return NULL;
 
     ret = xc_domain_stop(xc->xc_handle, dom);
@@ -81,12 +83,12 @@ static PyObject *pyxc_domain_destroy(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int dom;
-    int          force = 0, ret;
+    u64 dom;
+    int force = 0, ret;
 
     static char *kwd_list[] = { "dom", "force", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "L|i", kwd_list, 
                                       &dom, &force) )
         return NULL;
 
@@ -101,12 +103,12 @@ static PyObject *pyxc_domain_pincpu(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int dom;
-    int cpu, ret;
+    u64 dom;
+    int cpu = -1, ret;
 
     static char *kwd_list[] = { "dom", "cpu", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "L|i", kwd_list, 
                                       &dom, &cpu) )
         return NULL;
 
@@ -122,13 +124,13 @@ static PyObject *pyxc_domain_getinfo(PyObject *self,
     XcObject *xc = (XcObject *)self;
     PyObject *list;
 
-    unsigned int  first_dom = 0, max_doms = 1024;
-    int           nr_doms, i;
+    u64 first_dom = 0;
+    int max_doms = 1024, nr_doms, i;
     xc_dominfo_t *info;
 
     static char *kwd_list[] = { "first_dom", "max_doms", NULL };
     
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwd_list,
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|Li", kwd_list,
                                       &first_dom, &max_doms) )
         return NULL;
 
@@ -143,7 +145,7 @@ static PyObject *pyxc_domain_getinfo(PyObject *self,
     {
         PyList_SetItem(
             list, i, 
-            Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:L,s:s}",
+            Py_BuildValue("{s:L,s:i,s:i,s:i,s:l,s:L,s:s}",
                           "dom",      info[i].domid,
                           "cpu",      info[i].cpu,
                           "running",  info[i].has_cpu,
@@ -165,13 +167,13 @@ static PyObject *pyxc_linux_save(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int dom;
-    char        *state_file;
-    int          progress = 1, ret;
+    u64   dom;
+    char *state_file;
+    int   progress = 1, ret;
 
     static char *kwd_list[] = { "dom", "state_file", "progress", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is|i", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Ls|i", kwd_list, 
                                       &dom, &state_file, &progress) )
         return NULL;
 
@@ -188,6 +190,7 @@ static PyObject *pyxc_linux_restore(PyObject *self,
 
     char        *state_file;
     int          progress = 1, ret;
+    u64          dom;
 
     static char *kwd_list[] = { "state_file", "progress", NULL };
 
@@ -195,9 +198,11 @@ static PyObject *pyxc_linux_restore(PyObject *self,
                                       &state_file, &progress) )
         return NULL;
 
-    ret = xc_linux_restore(xc->xc_handle, state_file, progress);
-    
-    return PyInt_FromLong(ret);
+    ret = xc_linux_restore(xc->xc_handle, state_file, progress, &dom);
+    if ( ret < 0 )
+        return PyLong_FromLong(ret);
+
+    return PyLong_FromUnsignedLongLong(dom);
 }
 
 static PyObject *pyxc_linux_build(PyObject *self,
@@ -206,13 +211,13 @@ static PyObject *pyxc_linux_build(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int dom;
-    char        *image, *ramdisk = NULL, *cmdline = "";
-    int          ret;
+    u64   dom;
+    char *image, *ramdisk = NULL, *cmdline = "";
+    int   ret;
 
     static char *kwd_list[] = { "dom", "image", "ramdisk", "cmdline", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is|ss", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Ls|ss", kwd_list, 
                                       &dom, &image, &ramdisk, &cmdline) )
         return NULL;
 
@@ -227,13 +232,13 @@ static PyObject *pyxc_netbsd_build(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int dom;
-    char        *image, *ramdisk = NULL, *cmdline = "";
-    int          ret;
+    u64   dom;
+    char *image, *ramdisk = NULL, *cmdline = "";
+    int   ret;
 
     static char *kwd_list[] = { "dom", "image", "ramdisk", "cmdline", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is|ss", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Ls|ss", kwd_list, 
                                       &dom, &image, &ramdisk, &cmdline) )
         return NULL;
 
@@ -267,14 +272,14 @@ static PyObject *pyxc_bvtsched_domain_set(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int  dom;
+    u64           dom;
     unsigned long mcuadv, warp, warpl, warpu;
     int           ret;
 
     static char *kwd_list[] = { "dom", "mcuadv", "warp", "warpl", 
                                 "warpu", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "illll", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Lllll", kwd_list, 
                                       &dom, &mcuadv, &warp, &warpl, &warpu) )
         return NULL;
 
@@ -290,14 +295,15 @@ static PyObject *pyxc_vif_scheduler_set(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int  dom, vif;
+    u64           dom;
+    unsigned int  vif;
     xc_vif_sched_params_t sched = { 0, 0 };
     int           ret;
 
     static char *kwd_list[] = { "dom", "vif", "credit_bytes", 
                                 "credit_usecs", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii|ll", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li|ll", kwd_list, 
                                       &dom, &vif, 
                                       &sched.credit_bytes, 
                                       &sched.credit_usec) )
@@ -315,13 +321,14 @@ static PyObject *pyxc_vif_scheduler_get(PyObject *self,
     XcObject *xc = (XcObject *)self;
     PyObject *dict;
 
-    unsigned int  dom, vif;
+    u64           dom;
+    unsigned int  vif;
     xc_vif_sched_params_t sched;
     int           ret;
 
     static char *kwd_list[] = { "dom", "vif", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, 
                                       &dom, &vif) )
         return NULL;
 
@@ -344,13 +351,14 @@ static PyObject *pyxc_vif_stats_get(PyObject *self,
     XcObject *xc = (XcObject *)self;
     PyObject *dict;
 
-    unsigned int  dom, vif;
+    u64            dom;
+    unsigned int   vif;
     xc_vif_stats_t stats;
-    int           ret;
+    int            ret;
 
     static char *kwd_list[] = { "dom", "vif", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, 
                                       &dom, &vif) )
         return NULL;
 
@@ -374,12 +382,13 @@ static PyObject *pyxc_vbd_create(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int dom, vbd;
+    u64          dom;
+    unsigned int vbd;
     int          writeable, ret;
 
     static char *kwd_list[] = { "dom", "vbd", "writeable", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iii", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Lii", kwd_list, 
                                       &dom, &vbd, &writeable) )
         return NULL;
 
@@ -394,12 +403,13 @@ static PyObject *pyxc_vbd_destroy(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int dom, vbd;
+    u64          dom;
+    unsigned int vbd;
     int          ret;
 
     static char *kwd_list[] = { "dom", "vbd", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, 
                                       &dom, &vbd) )
         return NULL;
 
@@ -414,14 +424,15 @@ static PyObject *pyxc_vbd_grow(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int   dom, vbd;
+    u64            dom;
+    unsigned int   vbd;
     xc_vbdextent_t extent;
     int            ret;
 
     static char *kwd_list[] = { "dom", "vbd", "device", 
                                 "start_sector", "nr_sectors", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiill", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Liill", kwd_list, 
                                       &dom, &vbd, 
                                       &extent.real_device, 
                                       &extent.start_sector, 
@@ -439,12 +450,13 @@ static PyObject *pyxc_vbd_shrink(PyObject *self,
 {
     XcObject *xc = (XcObject *)self;
 
-    unsigned int  dom, vbd;
-    int           ret;
+    u64          dom;
+    unsigned int vbd;
+    int          ret;
 
     static char *kwd_list[] = { "dom", "vbd", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, 
                                       &dom, &vbd) )
         return NULL;
 
@@ -460,13 +472,14 @@ static PyObject *pyxc_vbd_setextents(PyObject *self,
     XcObject *xc = (XcObject *)self;
     PyObject *list, *dict, *obj;
 
-    unsigned int    dom, vbd;
+    u64             dom;
+    unsigned int    vbd;
     xc_vbdextent_t *extents = NULL;
     int             ret, i, nr_extents;
 
     static char *kwd_list[] = { "dom", "vbd", "extents", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiO", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "LiO", kwd_list, 
                                       &dom, &vbd, &list) )
         goto fail;
 
@@ -520,13 +533,14 @@ static PyObject *pyxc_vbd_getextents(PyObject *self,
     XcObject *xc = (XcObject *)self;
     PyObject *list;
 
-    unsigned int    dom, vbd;
+    u64             dom;
+    unsigned int    vbd;
     xc_vbdextent_t *extents;
     int             i, nr_extents, max_extents;
 
     static char *kwd_list[] = { "dom", "vbd", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Li", kwd_list, 
                                       &dom, &vbd) )
         return NULL;
 
@@ -570,13 +584,14 @@ static PyObject *pyxc_vbd_probe(PyObject *self,
     XcObject *xc = (XcObject *)self;
     PyObject *list;
 
-    unsigned int dom = XC_VBDDOM_PROBE_ALL, max_vbds = 1024;
+    u64          dom = XC_VBDDOM_PROBE_ALL;
+    unsigned int max_vbds = 1024;
     xc_vbd_t    *info;
     int          nr_vbds, i;
 
     static char *kwd_list[] = { "dom", "max_vbds", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|Li", kwd_list, 
                                       &dom, &max_vbds) )
         return NULL;
 
@@ -591,7 +606,7 @@ static PyObject *pyxc_vbd_probe(PyObject *self,
     {
         PyList_SetItem(
             list, i, 
-            Py_BuildValue("{s:i,s:i,s:i,s:l}",
+            Py_BuildValue("{s:L,s:i,s:i,s:l}",
                           "dom",        info[i].domid,
                           "vbd",        info[i].vbdid,
                           "writeable",  !!(info[i].flags & XC_VBDF_WRITEABLE),
@@ -631,27 +646,27 @@ static PyMethodDef pyxc_methods[] = {
       "Create a new domain.\n"
       " mem_kb [int, 65536]:    Memory allocation, in kilobytes.\n"
       " name   [str, '(anon)']: Informative textual name.\n\n"
-      "Returns: [int] new domain identifier; -1 on error.\n" },
+      "Returns: [long] new domain identifier; -1 on error.\n" },
 
     { "domain_start", 
       (PyCFunction)pyxc_domain_start, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Start execution of a domain.\n"
-      " dom [int]: Identifier of domain to be started.\n\n"
+      " dom [long]: Identifier of domain to be started.\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "domain_stop", 
       (PyCFunction)pyxc_domain_stop, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Stop execution of a domain.\n"
-      " dom [int]: Identifier of domain to be stopped.\n\n"
+      " dom [long]: Identifier of domain to be stopped.\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "domain_destroy", 
       (PyCFunction)pyxc_domain_destroy, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Destroy a domain.\n"
-      " dom   [int]:    Identifier of domain to be destroyed.\n"
+      " dom   [long]:   Identifier of domain to be destroyed.\n"
       " force [int, 0]: Bool - force immediate destruction?\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
@@ -659,21 +674,21 @@ static PyMethodDef pyxc_methods[] = {
       (PyCFunction)pyxc_domain_pincpu, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Pin a domain to a specified CPU.\n"
-      " dom   [int]:    Identifier of domain to be destroyed.\n"
-      " force [int, -1]: CPU to pin to, or -1 to unpin\n\n"
+      " dom [long]:    Identifier of domain to be destroyed.\n"
+      " cpu [int, -1]: CPU to pin to, or -1 to unpin\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "domain_getinfo", 
       (PyCFunction)pyxc_domain_getinfo, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Get information regarding a set of domains, in increasing id order.\n"
-      " first_dom [int, 0]:    First domain to retrieve info about.\n"
+      " first_dom [long, 0]:   First domain to retrieve info about.\n"
       " max_doms  [int, 1024]: Maximum number of domains to retrieve info"
       " about.\n\n"
       "Returns: [list of dicts] if list length is less than 'max_doms'\n"
       "         parameter then there was an error, or the end of the\n"
       "         domain-id space was reached.\n"
-      " dom      [int]:  Identifier of domain to which this info pertains\n"
+      " dom      [long]: Identifier of domain to which this info pertains\n"
       " cpu      [int]:  CPU to which this domain is bound\n"
       " running  [int]:  Bool - is the domain currently running?\n"
       " stopped  [int]:  Bool - is the domain suspended?\n"
@@ -685,7 +700,7 @@ static PyMethodDef pyxc_methods[] = {
       (PyCFunction)pyxc_linux_save, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Save the CPU and memory state of a Linux guest OS.\n"
-      " dom        [int]:    Identifier of domain to be saved.\n"
+      " dom        [long]:   Identifier of domain to be saved.\n"
       " state_file [str]:    Name of state file. Must not currently exist.\n"
       " progress   [int, 1]: Bool - display a running progress indication?\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
@@ -696,26 +711,26 @@ static PyMethodDef pyxc_methods[] = {
       "Restore the CPU and memory state of a Linux guest OS.\n"
       " state_file [str]:    Name of state file. Must not currently exist.\n"
       " progress   [int, 1]: Bool - display a running progress indication?\n\n"
-      "Returns: [int] new domain identifier on success; -1 on error.\n" },
+      "Returns: [long] new domain identifier on success; -1 on error.\n" },
 
     { "linux_build", 
       (PyCFunction)pyxc_linux_build, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Build a new Linux guest OS.\n"
-      " dom     [int]:      Identifier of domain to build into.\n"
+      " dom     [long]:     Identifier of domain to build into.\n"
       " image   [str]:      Name of kernel image file. May be gzipped.\n"
       " ramdisk [str, n/a]: Name of ramdisk file, if any.\n"
       " cmdline [str, n/a]: Kernel parameters, if any.\n\n"
-      "Returns: [int] new domain identifier on success; -1 on error.\n" },
+      "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "netbsd_build", 
       (PyCFunction)pyxc_netbsd_build, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Build a new NetBSD guest OS.\n"
-      " dom     [int]:      Identifier of domain to build into.\n"
+      " dom     [long]:     Identifier of domain to build into.\n"
       " image   [str]:      Name of kernel image file. May be gzipped.\n"
       " cmdline [str, n/a]: Kernel parameters, if any.\n\n"
-      "Returns: [int] new domain identifier on success; -1 on error.\n" },
+      "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "bvtsched_global_set", 
       (PyCFunction)pyxc_bvtsched_global_set, 
@@ -728,18 +743,18 @@ static PyMethodDef pyxc_methods[] = {
       (PyCFunction)pyxc_bvtsched_domain_set, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Set per-domain tuning parameters for Borrowed Virtual Time scheduler.\n"
-      " dom    [int]: Identifier of domain to be tuned.\n"
-      " mcuadv [int]: Internal BVT parameter.\n"
-      " warp   [int]: Internal BVT parameter.\n"
-      " warpl  [int]: Internal BVT parameter.\n"
-      " warpu  [int]: Internal BVT parameter.\n\n"
+      " dom    [long]: Identifier of domain to be tuned.\n"
+      " mcuadv [int]:  Internal BVT parameter.\n"
+      " warp   [int]:  Internal BVT parameter.\n"
+      " warpl  [int]:  Internal BVT parameter.\n"
+      " warpu  [int]:  Internal BVT parameter.\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "vif_scheduler_set", 
       (PyCFunction)pyxc_vif_scheduler_set, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Set per-network-interface scheduling parameters.\n"
-      " dom          [int]:    Identifier of domain to be adjusted.\n"
+      " dom          [long]:   Identifier of domain to be adjusted.\n"
       " vif          [int]:    Identifier of VIF to be adjusted.\n"
       " credit_bytes [int, 0]: Tx bytes permitted each interval.\n"
       " credit_usecs [int, 0]: Interval, in usecs. 0 == no scheduling.\n\n"
@@ -749,7 +764,7 @@ static PyMethodDef pyxc_methods[] = {
       (PyCFunction)pyxc_vif_scheduler_get, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Query the per-network-interface scheduling parameters.\n"
-      " dom          [int]:    Identifier of domain to be queried.\n"
+      " dom          [long]:   Identifier of domain to be queried.\n"
       " vif          [int]:    Identifier of VIF to be queried.\n\n"
       "Returns: [dict] dictionary is empty on failure.\n"
       " credit_bytes [int]: Tx bytes permitted each interval.\n"
@@ -759,8 +774,8 @@ static PyMethodDef pyxc_methods[] = {
       (PyCFunction)pyxc_vif_stats_get, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Query the per-network-interface statistics.\n"
-      " dom          [int]: Identifier of domain to be queried.\n"
-      " vif          [int]: Identifier of VIF to be queried.\n\n"
+      " dom          [long]: Identifier of domain to be queried.\n"
+      " vif          [int]:  Identifier of VIF to be queried.\n\n"
       "Returns: [dict] dictionary is empty on failure.\n"
       " tx_bytes   [long]: Bytes transmitted.\n"
       " tx_packets [long]: Packets transmitted.\n"
@@ -771,44 +786,44 @@ static PyMethodDef pyxc_methods[] = {
       (PyCFunction)pyxc_vbd_create, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Create a new virtual block device associated with a given domain.\n"
-      " dom       [int]: Identifier of domain to get a new VBD.\n"
-      " vbd       [int]: Identifier for new VBD.\n"
-      " writeable [int]: Bool - is the new VBD writeable?\n\n"
+      " dom       [long]: Identifier of domain to get a new VBD.\n"
+      " vbd       [int]:  Identifier for new VBD.\n"
+      " writeable [int]:  Bool - is the new VBD writeable?\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "vbd_destroy", 
       (PyCFunction)pyxc_vbd_destroy, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Destroy a virtual block device.\n"
-      " dom       [int]: Identifier of domain containing the VBD.\n"
-      " vbd       [int]: Identifier of the VBD.\n\n"
+      " dom       [long]: Identifier of domain containing the VBD.\n"
+      " vbd       [int]:  Identifier of the VBD.\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "vbd_grow", 
       (PyCFunction)pyxc_vbd_grow, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Grow a virtual block device by appending a new extent.\n"
-      " dom          [int]: Identifier of domain containing the VBD.\n"
-      " vbd          [int]: Identifier of the VBD.\n"
-      " device       [int]: Identifier of the real underlying block device.\n"
-      " start_sector [int]: Real start sector of this extent.\n"
-      " nr_sectors   [int]: Length, in sectors, of this extent.\n\n"
+      " dom          [long]: Identifier of domain containing the VBD.\n"
+      " vbd          [int]:  Identifier of the VBD.\n"
+      " device       [int]:  Identifier of the real underlying block device.\n"
+      " start_sector [int]:  Real start sector of this extent.\n"
+      " nr_sectors   [int]:  Length, in sectors, of this extent.\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "vbd_shrink", 
       (PyCFunction)pyxc_vbd_shrink, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Shrink a virtual block device by deleting its final extent.\n"
-      " dom          [int]: Identifier of domain containing the VBD.\n"
-      " vbd          [int]: Identifier of the VBD.\n\n"
+      " dom          [long]: Identifier of domain containing the VBD.\n"
+      " vbd          [int]:  Identifier of the VBD.\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "vbd_setextents", 
       (PyCFunction)pyxc_vbd_setextents, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Set all the extent information for a virtual block device.\n"
-      " dom          [int]: Identifier of domain containing the VBD.\n"
-      " vbd          [int]: Identifier of the VBD.\n"
+      " dom          [long]: Identifier of domain containing the VBD.\n"
+      " vbd          [int]:  Identifier of the VBD.\n"
       " extents      [list of dicts]: Per-extent information.\n"
       "  device       [int]: Identifier of the real underlying block device.\n"
       "  start_sector [int]: Real start sector of this extent.\n"
@@ -819,8 +834,8 @@ static PyMethodDef pyxc_methods[] = {
       (PyCFunction)pyxc_vbd_getextents, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Get info on all the extents in a virtual block device.\n"
-      " dom          [int]: Identifier of domain containing the VBD.\n"
-      " vbd          [int]: Identifier of the VBD.\n\n"
+      " dom          [long]: Identifier of domain containing the VBD.\n"
+      " vbd          [int]:  Identifier of the VBD.\n\n"
       "Returns: [list of dicts] per-extent information; empty on error.\n"
       " device       [int]: Identifier of the real underlying block device.\n"
       " start_sector [int]: Real start sector of this extent.\n"
@@ -830,14 +845,14 @@ static PyMethodDef pyxc_methods[] = {
       (PyCFunction)pyxc_vbd_probe, 
       METH_VARARGS | METH_KEYWORDS, "\n"
       "Get information regarding extant virtual block devices.\n"
-      " dom          [int, ALL]:  Domain to query (default is to query all).\n"
+      " dom          [long, ALL]: Domain to query (default is to query all).\n"
       " max_vbds     [int, 1024]: Maximum VBDs to query.\n\n"
       "Returns: [list of dicts] if list length is less than 'max_vbds'\n"
       "         parameter then there was an error, or there were fewer vbds.\n"
-      " dom        [int]: Domain containing this VBD.\n"
-      " vbd        [int]: Domain-specific identifier of this VBD.\n"
-      " writeable  [int]: Bool - is this VBD writeable?\n"
-      " nr_sectors [int]: Size of this VBD, in 512-byte sectors.\n" },
+      " dom        [long]: Domain containing this VBD.\n"
+      " vbd        [int]:  Domain-specific identifier of this VBD.\n"
+      " writeable  [int]:  Bool - is this VBD writeable?\n"
+      " nr_sectors [int]:  Size of this VBD, in 512-byte sectors.\n" },
 
     { "readconsolering", 
       (PyCFunction)pyxc_readconsolering, 
index fe34ff16f513cdab42c0798dd42b3d4707093a25..ac38ab511f9bc4eb20c0eb54628e911ed8f14e8d 100644 (file)
@@ -17,7 +17,7 @@ void init_fpu(void)
 {
     __asm__("fninit");
     if ( cpu_has_xmm ) load_mxcsr(0x1f80);
-    current->flags |= PF_DONEFPUINIT;
+    set_bit(PF_DONEFPUINIT, &current->flags);
 }
 
 static inline void __save_init_fpu( struct task_struct *tsk )
@@ -29,7 +29,7 @@ static inline void __save_init_fpu( struct task_struct *tsk )
         asm volatile( "fnsave %0 ; fwait"
                       : "=m" (tsk->thread.i387.fsave) );
     }
-    tsk->flags &= ~PF_USEDFPU;
+    clear_bit(PF_USEDFPU, &tsk->flags);
 }
 
 void save_init_fpu( struct task_struct *tsk )
@@ -39,7 +39,7 @@ void save_init_fpu( struct task_struct *tsk )
      * This causes us to set the real flag, so we'll need
      * to temporarily clear it while saving f-p state.
      */
-    if ( tsk->flags & PF_GUEST_STTS ) clts();
+    if ( test_bit(PF_GUEST_STTS, &tsk->flags) ) clts();
     __save_init_fpu(tsk);
     stts();
 }
index 9ec81487506cb0007110eef02c884a175d87a54c..035e932cb7c6fd5a4db545d4f0ecd22bcee3c8f5 100644 (file)
@@ -72,7 +72,7 @@ pdb_process_query (char *ptr)
        pdb_out_buffer[buf_idx++] = 'm';
         while ( (p = p->next_task) != &idle0_task )
        {
-           int domain = p->domain + PDB_DOMAIN_OFFSET;
+           domid_t domain = p->domain + PDB_DOMAIN_OFFSET;
 
            if (count > 0)
                pdb_out_buffer[buf_idx++] = ',';
index e75ee1e05020ebb87ef022748d418d4be47cf5b4..62725ea84d38a7889bdd5ac7d2a1da74531881f1 100644 (file)
@@ -289,7 +289,7 @@ void switch_to(struct task_struct *prev_p, struct task_struct *next_p)
 
 
 /* XXX Currently the 'domain' field is ignored! XXX */
-long do_iopl(unsigned int domain, unsigned int new_io_pl)
+long do_iopl(domid_t domain, unsigned int new_io_pl)
 {
     execution_context_t *ec = get_execution_context();
     ec->eflags = (ec->eflags & 0xffffcfff) | ((new_io_pl&3) << 12);
index 083aa3ce2e998f4260ae9bb6a4dc02f952a19261..0812c0cdb1e4a596e5f53a79ad358414a26ee39c 100644 (file)
@@ -673,7 +673,9 @@ static void __init do_boot_cpu (int apicid)
 
     if ( (idle = do_createdomain(IDLE_DOMAIN_ID, cpu)) == NULL )
         panic("failed 'createdomain' for CPU %d", cpu);
+
+    set_bit(PF_IDLETASK, &idle->flags);
+
     idle->mm.pagetable = mk_pagetable(__pa(idle_pg_table));
 
     map_cpu_to_boot_apicid(cpu, apicid);
index 13ec1a8e6c6b903eb01c9d23f4b77a206239d421..86ba116b6d7d29ef251db89800c62bc4ade383c9 100644 (file)
@@ -500,22 +500,21 @@ asmlinkage void math_state_restore(struct pt_regs *regs, long error_code)
     /* Prevent recursion. */
     clts();
 
-    if ( !(current->flags & PF_USEDFPU) )
+    if ( !test_bit(PF_USEDFPU, &current->flags) )
     {
-        if ( current->flags & PF_DONEFPUINIT )
+        if ( test_bit(PF_DONEFPUINIT, &current->flags) )
             restore_fpu(current);
         else
             init_fpu();
-        current->flags |= PF_USEDFPU;   /* So we fnsave on switch_to() */    
+        set_bit(PF_USEDFPU, &current->flags); /* so we fnsave on switch_to() */
     }
 
-    if ( current->flags & PF_GUEST_STTS )
+    if ( test_and_clear_bit(PF_GUEST_STTS, &current->flags) )
     {
         struct guest_trap_bounce *gtb = guest_trap_bounce+smp_processor_id();
         gtb->flags      = GTBF_TRAP_NOCODE;
         gtb->cs         = current->thread.traps[7].cs;
         gtb->eip        = current->thread.traps[7].address;
-        current->flags &= ~PF_GUEST_STTS;
     }
 }
 
@@ -802,7 +801,7 @@ long do_set_fast_trap(int idx)
 
 long do_fpu_taskswitch(void)
 {
-    current->flags |= PF_GUEST_STTS;
+    set_bit(PF_GUEST_STTS, &current->flags);
     stts();
     return 0;
 }
diff --git a/xen/common/block.c b/xen/common/block.c
deleted file mode 100644 (file)
index 851b3b5..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/* block.c
- *
- * ring data structures for buffering messages between hypervisor and
- * guestos's. 
- *
- */
-
-#include <hypervisor-ifs/block.h>
-#include <xeno/lib.h>
-
-/*
- * create_block_ring
- *
- * domain:
- *
- * allocates space for a particular domain's block io ring.
- */
-blk_ring_t *create_block_ring(int domain)
-{
-    printk ("XEN create block ring <not implemented>");
-    return (blk_ring_t *)NULL; 
-}
index 5c178a4a7d619c9aafd76386e1fe62bd942bb8a5..c65e588771b125d4b2367ca7a75f46add3545ab8 100644 (file)
 
 
 /* adapted from asm-xeno/page.h */
-static inline unsigned long machine_to_phys(int domain, unsigned long machine)
+static inline unsigned long machine_to_phys(domid_t domain, 
+                                            unsigned long machine)
 {
   unsigned long phys;
   pdb_get_values(domain, (u_char *) &phys,
-                (unsigned long) machine_to_phys_mapping + (machine >> PAGE_SHIFT) * 4,
+                (unsigned long) machine_to_phys_mapping + 
+                 (machine >> PAGE_SHIFT) * 4,
                 sizeof(phys));
   phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
   return phys;
@@ -61,7 +63,7 @@ static inline unsigned long machine_to_phys(int domain, unsigned long machine)
 */
 
 /* read a byte from a process */
-u_char pdb_linux_get_value (int domain, int pid, unsigned long addr)
+u_char pdb_linux_get_value(domid_t domain, int pid, unsigned long addr)
 {
   u_char result = 0;
   unsigned long task_struct_p, mm_p, pgd, task_struct_pid;
@@ -90,7 +92,7 @@ u_char pdb_linux_get_value (int domain, int pid, unsigned long addr)
   if (task_struct_p == (unsigned long)NULL)
   {
     /* oops */
-    printk ("error: couldn't find process 0x%x in domain %d\n", pid, domain);
+    printk ("error: couldn't find process 0x%x in domain %llu\n", pid, domain);
     return 0;
   }
 
index 3642c4c8d595311f0fa8472804603a986edc8975..dff739d99a51a2328f12209e9c9a03966d7018fc 100644 (file)
 
 /****************************************************************************/
 
-extern int pdb_change_values (int domain, u_char *buffer, unsigned long addr,
-                              int length, int rw);
-extern u_char pdb_linux_get_value (int domain, int pid, unsigned long addr);
+extern int pdb_change_values(domid_t domain, 
+                             u_char *buffer, unsigned long addr,
+                             int length, int rw);
+extern u_char pdb_linux_get_value(domid_t domain, int pid, unsigned long addr);
 
 /*
  * Set memory in a domain's address space
@@ -35,7 +36,8 @@ extern u_char pdb_linux_get_value (int domain, int pid, unsigned long addr);
  * THIS WILL BECOME A MACRO
  */
 
-int pdb_set_values (int domain, u_char *buffer, unsigned long addr, int length)
+int pdb_set_values(domid_t domain, 
+                   u_char *buffer, unsigned long addr, int length)
 {
     int count = pdb_change_values(domain, buffer, addr, length, 2);
 
@@ -63,7 +65,8 @@ int pdb_set_values (int domain, u_char *buffer, unsigned long addr, int length)
  * THIS WILL BECOME A MACRO
  */
 
-int pdb_get_values (int domain, u_char *buffer, unsigned long addr, int length)
+int pdb_get_values(domid_t domain, 
+                   u_char *buffer, unsigned long addr, int length)
 {
     return pdb_change_values(domain, buffer, addr, length, 1);
 }
@@ -75,8 +78,8 @@ int pdb_get_values (int domain, u_char *buffer, unsigned long addr, int length)
  * RW: 1 = read, 2 = write
  */
 
-int pdb_change_values (int domain, u_char *buffer, unsigned long addr,
-                      int length, int rw)
+int pdb_change_values(domid_t domain, u_char *buffer, unsigned long addr,
+                      int length, int rw)
 {
     struct task_struct *p;
     l2_pgentry_t* l2_table = NULL;
@@ -166,7 +169,7 @@ void pdb_do_debug (dom0_op_t *op)
 {
     op->u.debug.status = 0;
 
-    TRC(printk("PDB: op:%c, dom:%x, in1:%x, in2:%x, in3:%x, in4:%x\n",
+    TRC(printk("PDB: op:%c, dom:%llu, in1:%x, in2:%x, in3:%x, in4:%x\n",
               op->u.debug.opcode, op->u.debug.domain,
               op->u.debug.in1, op->u.debug.in2,
               op->u.debug.in3, op->u.debug.in4));
@@ -186,7 +189,7 @@ void pdb_do_debug (dom0_op_t *op)
            struct task_struct * p = find_domain_by_id(op->u.debug.domain);
            if ( p != NULL )
            {
-               if ( (p->flags & PF_CONSTRUCTED) != 0 )
+               if ( test_bit(PF_CONSTRUCTED, &p->flags) )
                {
                    wake_up(p);
                    reschedule(p);
index 1d55ade1a5db2db262826c2ef5541eb3b0b63fb9..79f4ecc28571dbac088c544c031e8edcd7c1ad02 100644 (file)
@@ -22,21 +22,10 @@ extern unsigned int alloc_new_dom_mem(struct task_struct *, unsigned int);
 /* Basically used to protect the domain-id space. */
 static spinlock_t create_dom_lock = SPIN_LOCK_UNLOCKED;
 
-static unsigned int get_domnr(void)
+static domid_t get_domnr(void)
 {
-    static unsigned int domnr = 0;
-    struct task_struct *p;
-    int tries = 0;
-
-    for ( tries = 0; tries < 1024; tries++ )
-    {
-        domnr = (domnr+1) & ((1<<20)-1);
-        if ( (p = find_domain_by_id(domnr)) == NULL )
-            return domnr;
-        put_task_struct(p);
-    }
-
-    return 0;
+    static domid_t domnr = 0;
+    return ++domnr;
 }
 
 static int msr_cpu_mask;
@@ -101,7 +90,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
         ret = -EINVAL;
         if ( p != NULL )
         {
-            if ( (p->flags & PF_CONSTRUCTED) != 0 )
+            if ( test_bit(PF_CONSTRUCTED, &p->flags) )
             {
                 wake_up(p);
                 reschedule(p);
@@ -122,7 +111,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
     {
         struct task_struct *p;
         static unsigned int pro = 0;
-        unsigned int dom;
+        domid_t dom;
         ret = -ENOMEM;
         
         spin_lock_irq(&create_dom_lock);
@@ -137,8 +126,8 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
 
        if ( op->u.createdomain.name[0] )
         {
-            strncpy (p->name, op->u.createdomain.name, MAX_DOMAIN_NAME);
-            p->name[MAX_DOMAIN_NAME - 1] = 0;
+            strncpy(p->name, op->u.createdomain.name, MAX_DOMAIN_NAME);
+            p->name[MAX_DOMAIN_NAME - 1] = '\0';
        }
 
         ret = alloc_new_dom_mem(p, op->u.createdomain.memory_kb);
@@ -148,9 +137,9 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
             goto exit_create;
         }
 
-        ret = p->domain;
+        ret = 0;
         
-        op->u.createdomain.domain = ret;
+        op->u.createdomain.domain = p->domain;
         copy_to_user(u_dom0_op, op, sizeof(*op));
  
     exit_create:
@@ -160,7 +149,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
 
     case DOM0_DESTROYDOMAIN:
     {
-        unsigned int dom = op->u.destroydomain.domain;
+        domid_t dom = op->u.destroydomain.domain;
         int force = op->u.destroydomain.force;
         ret = (dom == IDLE_DOMAIN_ID) ? -EPERM : kill_other_domain(dom, force);
     }
@@ -214,7 +203,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
 
     case DOM0_ADJUSTDOM:
     {
-        unsigned int   dom     = op->u.adjustdom.domain;
+        domid_t        dom     = op->u.adjustdom.domain;
         unsigned long  mcu_adv = op->u.adjustdom.mcu_adv;
         unsigned long  warp    = op->u.adjustdom.warp;
         unsigned long  warpl   = op->u.adjustdom.warpl;
@@ -303,7 +292,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
                 memcpy(&op->u.getdomaininfo.ctxt.i386_ctxt, 
                        &p->shared_info->execution_context,
                        sizeof(p->shared_info->execution_context));
-                if ( p->flags & PF_DONEFPUINIT )
+                if ( test_bit(PF_DONEFPUINIT, &p->flags) )
                     op->u.getdomaininfo.ctxt.flags |= ECF_I387_VALID;
                 memcpy(&op->u.getdomaininfo.ctxt.i387_ctxt,
                        &p->thread.i387,
@@ -354,7 +343,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
     {
         struct pfn_info *page;
         unsigned long pfn = op->u.getpageframeinfo.pfn;
-        unsigned int dom = op->u.getpageframeinfo.domain;
+        domid_t dom = op->u.getpageframeinfo.domain;
         struct task_struct *p;
 
         ret = -EINVAL;
@@ -395,7 +384,7 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
 
     case DOM0_IOPL:
     {
-        extern long do_iopl(unsigned int, unsigned int);
+        extern long do_iopl(domid_t, unsigned int);
         ret = do_iopl(op->u.iopl.domain, op->u.iopl.iopl);
     }
     break;
index 139ff3742da109fb45f793ec5444e968b24f1ac2..4f45a88b914c00ad4a25f629707e8b6cea79ec7d 100644 (file)
 rwlock_t tasklist_lock __cacheline_aligned = RW_LOCK_UNLOCKED;
 struct task_struct *task_hash[TASK_HASH_SIZE];
 
-struct task_struct *do_createdomain(unsigned int dom_id, unsigned int cpu)
+struct task_struct *do_createdomain(domid_t dom_id, unsigned int cpu)
 {
     int retval;
+    char buf[100];
     struct task_struct *p = NULL;
     unsigned long flags;
 
@@ -47,7 +48,10 @@ struct task_struct *do_createdomain(unsigned int dom_id, unsigned int cpu)
     p->domain    = dom_id;
     p->processor = cpu;
 
-    sprintf(p->name, "Domain-%d", dom_id);
+    /* We use a large intermediate to avoid overflow in sprintf. */
+    sprintf(buf, "Domain-%llu", dom_id);
+    strncpy(p->name, buf, MAX_DOMAIN_NAME);
+    p->name[MAX_DOMAIN_NAME-1] = '\0';
 
     spin_lock_init(&p->blk_ring_lock);
     spin_lock_init(&p->event_channel_lock);
@@ -79,7 +83,7 @@ struct task_struct *do_createdomain(unsigned int dom_id, unsigned int cpu)
 }
 
 
-struct task_struct *find_domain_by_id(unsigned int dom)
+struct task_struct *find_domain_by_id(domid_t dom)
 {
     struct task_struct *p;
     unsigned long flags;
@@ -103,8 +107,7 @@ struct task_struct *find_domain_by_id(unsigned int dom)
 
 void kill_domain_with_errmsg(const char *err)
 {
-    printk("DOM%d FATAL ERROR: %s\n", 
-           current->domain, err);
+    printk("DOM%llu FATAL ERROR: %s\n", current->domain, err);
     kill_domain();
 }
 
@@ -126,7 +129,7 @@ void __kill_domain(struct task_struct *p)
     if ( !sched_rem_domain(p) )
         return;
 
-    printk("Killing domain %d\n", p->domain);
+    printk("Killing domain %llu\n", p->domain);
 
     unlink_blkdev_info(p);
 
@@ -162,7 +165,7 @@ void kill_domain(void)
 }
 
 
-long kill_other_domain(unsigned int dom, int force)
+long kill_other_domain(domid_t dom, int force)
 {
     struct task_struct *p;
     unsigned long cpu_mask = 0;
@@ -200,7 +203,7 @@ void stop_domain(void)
     __enter_scheduler();
 }
 
-long stop_other_domain(unsigned int dom)
+long stop_other_domain(domid_t dom)
 {
     unsigned long cpu_mask;
     struct task_struct *p;
@@ -208,7 +211,7 @@ long stop_other_domain(unsigned int dom)
     if ( dom == 0 )
         return -EINVAL;
 
-    p = find_domain_by_id (dom);
+    p = find_domain_by_id(dom);
     if ( p == NULL) return -ESRCH;
     
     if ( p->state != TASK_STOPPED )
@@ -452,7 +455,7 @@ void release_task(struct task_struct *p)
     ASSERT(p->state == TASK_DYING);
     ASSERT(!p->has_cpu);
 
-    printk("Releasing task %d\n", p->domain);
+    printk("Releasing task %llu\n", p->domain);
 
     /*
      * This frees up blkdev rings and vbd-access lists. Totally safe since
@@ -480,12 +483,12 @@ int final_setup_guestos(struct task_struct *p, dom0_builddomain_t *builddomain)
     unsigned long phys_l2tab;
     int i;
 
-    if ( (p->flags & PF_CONSTRUCTED) )
+    if ( test_bit(PF_CONSTRUCTED, &p->flags) )
         return -EINVAL;
     
-    p->flags &= ~PF_DONEFPUINIT;
+    clear_bit(PF_DONEFPUINIT, &p->flags);
     if ( builddomain->ctxt.flags & ECF_I387_VALID )
-        p->flags |= PF_DONEFPUINIT;
+        set_bit(PF_DONEFPUINIT, &p->flags);
     memcpy(&p->shared_info->execution_context,
            &builddomain->ctxt.i386_ctxt,
            sizeof(p->shared_info->execution_context));
@@ -526,7 +529,7 @@ int final_setup_guestos(struct task_struct *p, dom0_builddomain_t *builddomain)
     while ( builddomain->num_vifs-- > 0 )
         (void)create_net_vif(p->domain);
 
-    p->flags |= PF_CONSTRUCTED;
+    set_bit(PF_CONSTRUCTED, &p->flags);
     
     return 0;
 }
@@ -553,7 +556,8 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params,
 {
     struct list_head *list_ent;
     char *src, *vsrc, *dst, *data_start;
-    int i, dom = p->domain;
+    int i;
+    domid_t dom = p->domain;
     unsigned long phys_l1tab, phys_l2tab;
     unsigned long cur_address, alloc_address;
     unsigned long virt_load_address, virt_stack_address;
@@ -571,7 +575,7 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params,
 
     /* Sanity! */
     if ( p->domain != 0 ) BUG();
-    if ( (p->flags & PF_CONSTRUCTED) ) BUG();
+    if ( test_bit(PF_CONSTRUCTED, &p->flags) ) BUG();
 
     /*
      * This is all a bit grim. We've moved the modules to the "safe" physical 
@@ -589,21 +593,21 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params,
 
     if ( strncmp(data_start, "XenoGues", 8) )
     {
-        printk("DOM%d: Invalid guest OS image\n", dom);
+        printk("DOM%llu: Invalid guest OS image\n", dom);
         return -1;
     }
 
     virt_load_address = *(unsigned long *)(data_start + 8);
     if ( (virt_load_address & (PAGE_SIZE-1)) )
     {
-        printk("DOM%d: Guest OS load address not page-aligned (%08lx)\n",
+        printk("DOM%llu: Guest OS load address not page-aligned (%08lx)\n",
                dom, virt_load_address);
         return -1;
     }
 
     if ( alloc_new_dom_mem(p, params->memory_kb) )
     {
-        printk("DOM%d: Not enough memory --- reduce dom0_mem ??\n", dom);
+        printk("DOM%llu: Not enough memory --- reduce dom0_mem ??\n", dom);
         return -ENOMEM;
     }
 
@@ -614,7 +618,7 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params,
 
     if ( data_len > (params->memory_kb << 9) )
     {
-        printk("DOM%d: Guest OS image is too large\n"
+        printk("DOM%llu: Guest OS image is too large\n"
                "       (%luMB is greater than %uMB limit for a\n"
                "        %uMB address space)\n",
                dom, data_len>>20,
@@ -624,7 +628,7 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params,
         return -1;
     }
 
-    printk("DOM%d: Guest OS virtual load address is %08lx\n", dom,
+    printk("DOM%llu: Guest OS virtual load address is %08lx\n", dom,
            virt_load_address);
     
     SET_GDT_ENTRIES(p, DEFAULT_GDT_ENTRIES);
@@ -753,14 +757,11 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params,
     virt_startinfo_address->pt_base = virt_load_address + 
         ((p->tot_pages - 1) << PAGE_SHIFT); 
 
-    virt_startinfo_address->dom_id = p->domain;
     virt_startinfo_address->flags  = 0;
     if ( IS_PRIV(p) )
-    {
         virt_startinfo_address->flags |= SIF_PRIVILEGED;
-        if ( CONSOLE_ISOWNER(p) )
-            virt_startinfo_address->flags |= SIF_CONSOLE;
-    }
+    if ( p->domain == 0 )
+        virt_startinfo_address->flags |= SIF_INITDOMAIN;
 
     if ( initrd_len )
     {
@@ -787,12 +788,8 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params,
     *dst = '\0';
 
     /* If this guy's getting the console we'd better let go. */
-    if ( virt_startinfo_address->flags & SIF_CONSOLE )
-    {
-        /* NB. Should reset the console here. */
+    if ( CONSOLE_ISOWNER(p) )
         opt_console = 0;
-    }  
-
 
     /* Reinstate the caller's page tables. */
     write_cr3_counted(pagetable_val(current->mm.pagetable));
@@ -819,7 +816,7 @@ int setup_guestos(struct task_struct *p, dom0_createdomain_t *params,
     }
     kfree(xd);
 
-    p->flags |= PF_CONSTRUCTED;
+    set_bit(PF_CONSTRUCTED, &p->flags);
 
     new_thread(p, 
                (unsigned long)virt_load_address, 
index 86138c59e658fc42d2aba6a6360c008df568a7f2..3554ec5b17d1f5be2f599681ebb0575140f8ec65 100644 (file)
@@ -222,6 +222,8 @@ void cmain (unsigned long magic, multiboot_info_t *mbi)
     new_dom = do_createdomain(0, 0);
     if ( new_dom == NULL ) panic("Error creating domain 0\n");
 
+    set_bit(PF_PRIVILEGED, &new_dom->flags);
+
     /*
      * We're going to setup domain0 using the module(s) that we stashed safely
      * above our MAX_DIRECTMAP_ADDRESS in boot/Boot.S The second module, if
@@ -620,7 +622,7 @@ int console_export(char *str, int len)
 
     unmap_domain_mem(skb_data);
     
-    skb->dst_vif = find_vif_by_id(0);
+    skb->dst_vif = find_net_vif(0, 0);
     (void)netif_rx(skb);
 
     return 1;
@@ -655,7 +657,7 @@ long do_console_write(char *str, unsigned int count)
         spin_lock_irqsave(&console_lock, flags);
         
         __putstr("DOM"); 
-        sprintf(dom_id, "%d", current->domain);
+        sprintf(dom_id, "%llu", current->domain);
         __putstr(dom_id);
         __putstr(": ");
         
index 3c92eb976f0144cd211e070eafc37d04e8c1a230..ec0eee2af6de02b4fadf058fb7c2f9c3c5836a0d 100644 (file)
@@ -107,7 +107,7 @@ void do_task_queues(u_char key, void *dev_id, struct pt_regs *regs)
 
     p = &idle0_task;
     do {
-        printk("Xen: DOM %d, CPU %d [has=%c], state = %s, "
+        printk("Xen: DOM %llu, CPU %d [has=%c], state = %s, "
                "hyp_events = %08x\n", 
                p->domain, p->processor, p->has_cpu ? 'T':'F', 
                task_states[p->state], p->hyp_events); 
index 14bfa8dac5def52ba9ce5142420d48a0d8e14966..9514745d4504b33b07805e4c295306f5d5c3f01d 100644 (file)
@@ -1,4 +1,5 @@
-/* network.c
+/******************************************************************************
+ * network.c
  *
  * Network virtualization for Xen.  Lower-level network interactions are in 
  * net/dev.c and in the drivers.  This file contains routines to interact 
@@ -6,6 +7,20 @@
  * the use of rules.
  *
  * Copyright (c) 2002-2003, A K Warfield and K A Fraser
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
 #include <xeno/sched.h>
@@ -32,11 +47,11 @@ void print_net_rule_list();
 /* ----[ VIF Functions ]----------------------------------------------------*/
 
 
-net_vif_t *find_vif_by_id(unsigned long id)
+net_vif_t *find_net_vif(domid_t dom, unsigned int idx)
 {
     struct task_struct *p;
     net_vif_t *vif = NULL;
-    unsigned long flags, dom = id>>VIF_DOMAIN_SHIFT;
+    unsigned long flags;
 
     read_lock_irqsave(&tasklist_lock, flags);
     p = task_hash[TASK_HASH(dom)];
@@ -44,8 +59,9 @@ net_vif_t *find_vif_by_id(unsigned long id)
     {
         if ( p->domain == dom )
         {
-            vif = p->net_vif_list[id&VIF_INDEX_MASK];
-            if ( vif != NULL ) get_vif(vif);
+            vif = p->net_vif_list[idx];
+            if ( vif != NULL )
+                get_vif(vif);
             break;
         }
         p = p->next_hash;
@@ -56,30 +72,32 @@ net_vif_t *find_vif_by_id(unsigned long id)
 }
 
 
-/* create_net_vif - Create a new vif and append it to the specified domain.
+/*
+ * create_net_vif - Create a new vif and append it to the specified domain.
  * 
- * the domain is examined to determine how many vifs currently are allocated
+ * The domain is examined to determine how many vifs currently are allocated
  * and the newly allocated vif is appended.  The vif is also added to the
  * global list.
  * 
  */
-net_vif_t *create_net_vif(int domain)
+net_vif_t *create_net_vif(domid_t dom)
 {
-    int dom_vif_idx;
+    unsigned int idx;
     net_vif_t *new_vif = NULL;
     net_ring_t *new_ring = NULL;
     struct task_struct *p = NULL;
     unsigned long flags, vmac_hash;
     unsigned char vmac_key[ETH_ALEN + 2 + MAX_DOMAIN_NAME];
 
-    if ( !(p = find_domain_by_id(domain)) )
+    if ( (p = find_domain_by_id(dom)) == NULL )
         return NULL;
     
     write_lock_irqsave(&tasklist_lock, flags);
 
-    for ( dom_vif_idx = 0; dom_vif_idx < MAX_DOMAIN_VIFS; dom_vif_idx++ )
-        if ( p->net_vif_list[dom_vif_idx] == NULL ) break;
-    if ( dom_vif_idx == MAX_DOMAIN_VIFS )
+    for ( idx = 0; idx < MAX_DOMAIN_VIFS; idx++ )
+        if ( p->net_vif_list[idx] == NULL )
+            break;
+    if ( idx == MAX_DOMAIN_VIFS )
         goto fail;
 
     if ( (new_vif = kmem_cache_alloc(net_vif_cache, GFP_KERNEL)) == NULL )
@@ -87,7 +105,8 @@ net_vif_t *create_net_vif(int domain)
 
     memset(new_vif, 0, sizeof(*new_vif));
     
-    if ( sizeof(net_ring_t) > PAGE_SIZE ) BUG();
+    if ( sizeof(net_ring_t) > PAGE_SIZE )
+        BUG();
     new_ring = (net_ring_t *)get_free_page(GFP_KERNEL);
     clear_page(new_ring);
     SHARE_PFN_WITH_DOMAIN(virt_to_page(new_ring), p);
@@ -98,9 +117,9 @@ net_vif_t *create_net_vif(int domain)
      */
     atomic_set(&new_vif->refcnt, 1);
     new_vif->shared_rings = new_ring;
-    new_vif->shared_idxs  = &p->shared_info->net_idx[dom_vif_idx];
+    new_vif->shared_idxs  = &p->shared_info->net_idx[idx];
     new_vif->domain       = p;
-    new_vif->idx          = dom_vif_idx;
+    new_vif->idx          = idx;
     new_vif->list.next    = NULL;
     spin_lock_init(&new_vif->rx_lock);
     spin_lock_init(&new_vif->tx_lock);
@@ -109,7 +128,7 @@ net_vif_t *create_net_vif(int domain)
     new_vif->credit_usec  = 0UL;
     init_ac_timer(&new_vif->credit_timeout);
 
-    if ( (p->domain == 0) && (dom_vif_idx == 0) )
+    if ( (p->domain == 0) && (idx == 0) )
     {
         /*
          * DOM0/VIF0 gets the real physical MAC address, so that users can 
@@ -134,7 +153,7 @@ net_vif_t *create_net_vif(int domain)
          * MAC addresses for some VIFs with no fear of clashes.
          */
         memcpy(&vmac_key[0], the_dev->dev_addr, ETH_ALEN);
-        *(__u16 *)(&vmac_key[ETH_ALEN]) = htons(dom_vif_idx);
+        *(__u16 *)(&vmac_key[ETH_ALEN]) = htons(idx);
         strcpy(&vmac_key[ETH_ALEN+2], p->name);
         vmac_hash = hash(vmac_key, ETH_ALEN + 2 + strlen(p->name));
         memcpy(new_vif->vmac, "\xaa\x00\x00", 3);
@@ -143,7 +162,7 @@ net_vif_t *create_net_vif(int domain)
         new_vif->vmac[5] = (vmac_hash >>  0) & 0xff;
     }
 
-    p->net_vif_list[dom_vif_idx] = new_vif;
+    p->net_vif_list[idx] = new_vif;
     
     write_unlock_irqrestore(&tasklist_lock, flags);
     return new_vif;
@@ -182,9 +201,6 @@ void unlink_net_vif(net_vif_t *vif)
 }
 
 
-/* vif_query - Call from the proc file system to get a list of indexes
- * in use by a particular domain.
- */
 int vif_query(vif_query_t *vq)
 {
     net_vif_t *vif;
@@ -193,7 +209,8 @@ int vif_query(vif_query_t *vq)
     int i;
     int count = 0;
 
-    if ( !(p = find_domain_by_id(vq->domain)) ) {
+    if ( (p = find_domain_by_id(vq->domain)) == NULL )
+    {
         buf[0] = -1;
         copy_to_user(vq->buf, buf, sizeof(int));
         return -ESRCH;
@@ -215,15 +232,11 @@ int vif_query(vif_query_t *vq)
     return 0;
 }
 
-/* vif_getinfo - Call from the proc file system to get info about a specific
- * vif in use by a particular domain.
- */
 int vif_getinfo(vif_getinfo_t *info)
 {
     net_vif_t *vif;
 
-    vif = find_vif_by_id((info->domain << VIF_DOMAIN_SHIFT) | info->vif);
-    if ( vif == NULL )
+    if ( (vif = find_net_vif(info->domain, info->vif)) == NULL )
         return -ESRCH;
 
     info->total_bytes_sent              = vif->total_bytes_sent;
@@ -244,8 +257,7 @@ int vif_setparams(vif_setparams_t *params)
 {
     net_vif_t *vif;
 
-    vif = find_vif_by_id((params->domain << VIF_DOMAIN_SHIFT) | params->vif);
-    if ( vif == NULL )
+    if ( (vif = find_net_vif(params->domain, params->vif)) == NULL )
         return -ESRCH;
 
     /* Turning off rate limiting? */
@@ -263,9 +275,6 @@ int vif_setparams(vif_setparams_t *params)
         
 /* ----[ Net Rule Functions ]-----------------------------------------------*/
 
-/* add_net_rule - Add a new network filter rule.
- */
-
 int add_net_rule(net_rule_t *rule)
 {
     net_rule_ent_t *new_ent;
@@ -283,83 +292,72 @@ int add_net_rule(net_rule_t *rule)
     return 0;
 }
 
-/* delete_net_rule - Delete an existing network rule.
- */
-
 int delete_net_rule(net_rule_t *rule)
 {
-    net_rule_ent_t *ent = net_rule_list, *prev = NULL;
-    while ( (ent) && ((memcmp(rule, &ent->r, sizeof(net_rule_t))) != 0) )
-    {
-        prev = ent;
-        ent = ent->next;
-    }
+    net_rule_ent_t **pent, *ent;
+
+    write_lock(&net_rule_lock);
 
-    if (ent != NULL)
+    for ( pent = &net_rule_list; pent != NULL; pent = &ent->next )
     {
-        write_lock(&net_rule_lock);
-        if (prev != NULL)
+        ent = *pent;
+        if ( memcmp(rule, &ent->r, sizeof(net_rule_t)) == 0 )
         {
-            prev->next = ent->next;
-        }
-        else
-        {
-            net_rule_list = ent->next;
+            *pent = ent->next;
+            kmem_cache_free(net_rule_cache, ent);
+            break;
         }
-        kmem_cache_free(net_rule_cache, ent);
-        write_unlock(&net_rule_lock);
     }
+
+    write_unlock(&net_rule_lock);
     return 0;
 }
  
-/* print_net_rule - Print a single net rule.
- */
+static char *idx_to_name(unsigned int idx)
+{
+    if ( idx == VIF_PHYSICAL_INTERFACE )
+        return "PHYSICAL";
+    if ( idx ==  VIF_ANY_INTERFACE )
+        return "ANY";
+    return "UNKNOWN";
+}
+
+static char *print_ip_addr(char *buf, unsigned long addr)
+{
+    sprintf(buf, "%lu.%lu.%lu.%lu", 
+            (addr>>24)&255, (addr>>16)&255, (addr>>8)&255, addr&255);
+    return buf;
+}
 
 void print_net_rule(net_rule_t *r)
 {
+    char buf[20];
+
     printk("===] NET RULE:\n");
-    printk("=] src_addr         : %lu\n", (unsigned long) r->src_addr);
-    printk("=] src_addr_mask    : %lu\n", (unsigned long) r->src_addr_mask);   
-    printk("=] dst_addr         : %lu\n", (unsigned long) r->dst_addr);
-    printk("=] dst_addr_mask    : %lu\n", (unsigned long) r->dst_addr_mask);
+    printk("=] src_addr         : %s\n", print_ip_addr(buf, r->src_addr));
+    printk("=] src_addr_mask    : %s\n", print_ip_addr(buf, r->src_addr_mask));
+    printk("=] dst_addr         : %s\n", print_ip_addr(buf, r->dst_addr));
+    printk("=] dst_addr_mask    : %s\n", print_ip_addr(buf, r->dst_addr_mask));
     printk("=] src_port         : %u\n", r->src_port);
     printk("=] src_port_mask    : %u\n", r->src_port_mask);
     printk("=] dst_port         : %u\n", r->dst_port);
     printk("=] dst_port_mask    : %u\n", r->dst_port_mask);
     printk("=] dst_proto        : %u\n", r->proto);
-    switch ( r->src_vif )
-    {
-    case VIF_PHYSICAL_INTERFACE:
-        printk("=] src_dom/idx      : PHYSICAL\n"); 
-        break;
-    case VIF_ANY_INTERFACE:
-        printk("=] src_dom/idx      : ANY\n"); 
-        break;
-    default:
-        printk("=] src_dom/idx      : %lu/%lu\n", 
-               r->src_vif>>VIF_DOMAIN_SHIFT, r->src_vif&VIF_INDEX_MASK);
-        break;
-    }
-    switch ( r->dst_vif )
-    {
-    case VIF_PHYSICAL_INTERFACE:
-        printk("=] dst_dom/idx      : PHYSICAL\n"); 
-        break;
-    case VIF_ANY_INTERFACE:
-        printk("=] dst_dom/idx      : ANY\n"); 
-        break;
-    default:
-        printk("=] dst_dom/idx      : %lu/%lu\n", 
-               r->dst_vif>>VIF_DOMAIN_SHIFT, r->dst_vif&VIF_INDEX_MASK);
-        break;
-    }
+
+    if ( r->src_dom == VIF_SPECIAL )
+        printk("=] src_dom/idx      : %s\n", idx_to_name(r->src_idx));
+    else
+        printk("=] src_dom/idx      : %llu/%u\n", r->src_dom, r->src_idx);
+
+    if ( r->dst_dom == VIF_SPECIAL )
+        printk("=] dst_dom/idx      : %s\n", idx_to_name(r->dst_idx));
+    else
+        printk("=] dst_dom/idx      : %llu/%u\n", r->dst_dom, r->dst_idx);
+
     printk("=] action           : %u\n", r->action);
 }
 
-/* print_net_rule_list - Print the global rule table.
- */
-
-void print_net_rule_list()
+void print_net_rule_list(void)
 {
     net_rule_ent_t *ent;
     int count = 0;
@@ -368,17 +366,19 @@ void print_net_rule_list()
 
     ent = net_rule_list;
     
-    while (ent) 
+    while ( ent != NULL )
     {
         print_net_rule(&ent->r);
         ent = ent->next;
         count++;
     }
+
     printk("\nTotal of %d rules.\n", count);
 
     read_unlock(&net_rule_lock);
 }
 
+
 /* net_find_rule - Find the destination vif according to the current rules.
  *
  * Apply the rules to this skbuff and return the vif id that it is bound for.
@@ -386,10 +386,12 @@ void print_net_rule_list()
  */
 static net_vif_t *net_find_rule(u8 nproto, u8 tproto, u32 src_addr, 
                                 u32 dst_addr, u16 src_port, 
-                                u16 dst_port, unsigned long src_vif)
+                                u16 dst_port, 
+                                domid_t src_dom, unsigned int src_idx)
 {
     net_rule_ent_t *ent;
-    unsigned long dest = VIF_UNKNOWN_INTERFACE;
+    domid_t dst_dom = VIF_SPECIAL;
+    unsigned int dst_idx = VIF_UNKNOWN_INTERFACE;
 
     read_lock(&net_rule_lock);
     
@@ -397,10 +399,13 @@ static net_vif_t *net_find_rule(u8 nproto, u8 tproto, u32 src_addr,
     
     while ( ent != NULL )
     {
-        if ( ((ent->r.src_vif == src_vif)
-              || (ent->r.src_vif == VIF_ANY_INTERFACE)) &&
+        if ( (((ent->r.src_dom == src_dom) && 
+               (ent->r.src_idx == src_idx)) ||
+              ((ent->r.src_dom == VIF_SPECIAL) && 
+               (ent->r.src_idx == VIF_ANY_INTERFACE))) &&
 
-             (src_vif != ent->r.dst_vif) &&
+             ((src_dom != ent->r.dst_dom) ||
+              (src_idx != ent->r.dst_idx)) &&
 
              (!((ent->r.src_addr ^ src_addr) & ent->r.src_addr_mask )) &&
              (!((ent->r.dst_addr ^ dst_addr) & ent->r.dst_addr_mask )) &&
@@ -418,14 +423,14 @@ static net_vif_t *net_find_rule(u8 nproto, u8 tproto, u32 src_addr,
                (tproto == IPPROTO_UDP)))
            )
         {
+            dst_dom = ent->r.dst_dom;
+            dst_idx = ent->r.dst_idx;
             /*
              * XXX FFS! We keep going to find the "best" rule. Where best 
              * corresponds to vaguely sane routing of a packet. We need a less 
              * shafted model for our "virtual firewall/router" methinks!
              */
-            if ( (dest & VIF_DOMAIN_MASK) == VIF_SPECIAL )
-                dest = ent->r.dst_vif;
-            if ( (dest & VIF_DOMAIN_MASK) != VIF_SPECIAL )
+            if ( dst_dom != VIF_SPECIAL )
                 break;
         }
         ent = ent->next;
@@ -433,12 +438,14 @@ static net_vif_t *net_find_rule(u8 nproto, u8 tproto, u32 src_addr,
 
     read_unlock(&net_rule_lock);
 
-    if ( dest == VIF_PHYSICAL_INTERFACE )
-        return VIF_PHYS;
-    else if ( (dest & VIF_DOMAIN_MASK) == VIF_SPECIAL )
+    if ( dst_dom == VIF_SPECIAL ) 
+    {
+        if ( dst_idx == VIF_PHYSICAL_INTERFACE )
+            return VIF_PHYS;
         return VIF_DROP;
-    else
-        return find_vif_by_id(dest);
+    }
+
+    return find_net_vif(dst_dom, dst_idx);
 }
 
 /* net_get_target_vif - Find the vif that the given sk_buff is bound for.
@@ -463,13 +470,17 @@ net_vif_t *net_get_target_vif(u8 *data, unsigned int len, net_vif_t *src_vif)
 {
     net_vif_t *target = VIF_DROP;
     u8 *h_raw, *nh_raw;
-    unsigned long src_vif_val = VIF_PHYSICAL_INTERFACE;
+    domid_t src_dom = VIF_SPECIAL;
+    unsigned int src_idx = VIF_PHYSICAL_INTERFACE;
 
     if ( src_vif != VIF_PHYS )
-        src_vif_val = (src_vif->domain->domain<<VIF_DOMAIN_SHIFT) | 
-            src_vif->idx;
+    {
+        src_dom = src_vif->domain->domain;
+        src_idx = src_vif->idx;
+    }
 
-    if ( len < ETH_HLEN ) goto drop;
+    if ( len < ETH_HLEN )
+        goto drop;
 
     nh_raw = data + ETH_HLEN;
     switch ( ntohs(*(unsigned short *)(data + 12)) )
@@ -478,7 +489,7 @@ net_vif_t *net_get_target_vif(u8 *data, unsigned int len, net_vif_t *src_vif)
         if ( len < (ETH_HLEN + 28) ) goto drop;
         target = net_find_rule((u8)ETH_P_ARP, 0, ntohl(*(u32 *)(nh_raw + 14)),
                                ntohl(*(u32 *)(nh_raw + 24)), 0, 0, 
-                               src_vif_val);
+                               src_dom, src_idx);
         break;
 
     case ETH_P_IP:
@@ -490,14 +501,14 @@ net_vif_t *net_get_target_vif(u8 *data, unsigned int len, net_vif_t *src_vif)
                                ntohl(*(u32 *)(nh_raw + 16)),
                                0,
                                0, 
-                               src_vif_val);
+                               src_dom, src_idx);
         break;
     }
     return target;
     
  drop:
-    printk("VIF%lu/%lu: pkt to drop!\n", 
-           src_vif_val>>VIF_DOMAIN_SHIFT, src_vif_val&VIF_INDEX_MASK);
+    printk("VIF%llu/%u: pkt to drop!\n", 
+           src_dom, src_idx);
     return VIF_DROP;
 }
 
index 5352bbb6a65867d72deb0cec139097ee86fa9432..122915f145583436ce28fc513123cb16b027d39d 100644 (file)
@@ -306,7 +306,7 @@ long sched_bvtctl(unsigned long c_allow)
 }
 
 /* Adjust scheduling parameter for a given domain. */
-long sched_adjdom(int dom, unsigned long mcu_adv, unsigned long warp, 
+long sched_adjdom(domid_t dom, unsigned long mcu_adv, unsigned long warp, 
                  unsigned long warpl, unsigned long warpu)
 {
     struct task_struct *p;
@@ -512,6 +512,7 @@ asmlinkage void __enter_scheduler(void)
      * 'next_prime's evt. Take context switch allowance into account.
      */
     ASSERT(next_prime->evt >= next->evt);
+    
     r_time = ((next_prime->evt - next->evt)/next->mcu_advance) + ctx_allow;
 
  sched_done:
@@ -697,7 +698,8 @@ static void dump_rqueue(struct list_head *queue, char *name)
             (unsigned long) queue->next, (unsigned long) queue->prev);
     list_for_each (list, queue) {
         p = list_entry(list, struct task_struct, run_list);
-        printk("%3d: %3d has=%c mcua=0x%04lX ev=0x%08X av=0x%08X c=0x%X%08X\n",
+        printk("%3d: %llu has=%c mcua=0x%04lX"
+               " ev=0x%08X av=0x%08X c=0x%X%08X\n",
                loop++, p->domain,
                p->has_cpu ? 'T':'F',
                p->mcu_advance, p->evt, p->avt,
index 6b993551e5bf180875a7506d03db5bd40cabc5d9..4f0888a185d7bf82c1bbc92bb1385e4b8c6e699e 100644 (file)
@@ -567,7 +567,7 @@ static void dump_blockq(u_char key, void *dev_id, struct pt_regs *regs)
     do {
         if ( !is_idle_task(p) )
         {
-            printk("Domain: %d\n", p->domain);
+            printk("Domain: %llu\n", p->domain);
             blk_ring = p->blk_ring_base;
             
             printk("  req_prod:0x%08x, req_cons:0x%08x resp_prod:0x%08x/"
index 7ec679d446f873f970ee854986f2d90370a89790..5a3f0fd5e6eb00bd1545232068206290d81e962a 100644 (file)
@@ -19,14 +19,13 @@ extern void save_init_fpu( struct task_struct *tsk );
 extern void restore_fpu( struct task_struct *tsk );
 
 #define unlazy_fpu( tsk ) do { \
-       if ( tsk->flags & PF_USEDFPU ) \
+       if ( test_bit(PF_USEDFPU, &tsk->flags) ) \
                save_init_fpu( tsk ); \
 } while (0)
 
 #define clear_fpu( tsk ) do { \
-       if ( tsk->flags & PF_USEDFPU ) { \
+       if ( test_and_clear_bit(PF_USEDFPU, &tsk->flags) ) { \
                asm volatile("fwait"); \
-               tsk->flags &= ~PF_USEDFPU; \
                stts(); \
        } \
 } while (0)
index b1416784fc8e062817ffdcca578bcf7862919e74..fa161f22d0f3562729e6414efbae0993d1cb9f29 100644 (file)
@@ -21,10 +21,10 @@ extern int pdb_high_bit;
 extern void initialize_pdb(void);
 
 /* Get/set values from generic debug interface. */
-extern int pdb_set_values (int domain, u_char *buffer, 
-                          unsigned long addr, int length);
-extern int pdb_get_values (int domain, u_char *buffer,
-                          unsigned long addr, int length);
+extern int pdb_set_values(domid_t domain, u_char *buffer, 
+                          unsigned long addr, int length);
+extern int pdb_get_values(domid_t domain, u_char *buffer,
+                          unsigned long addr, int length);
 
 /* External entry points. */
 extern int pdb_handle_exception(int exceptionVector,
index 0f0e32f66527e3784b21c153612436bf2fd21c12..515d8ad3383b24fe08492e52ae42fcaf4464ed6e 100644 (file)
@@ -98,7 +98,7 @@ typedef struct xen_disk
     unsigned short device;       /* device number (opaque 16 bit val)  */
     unsigned short info;         /* device type and flags              */
     unsigned long  capacity;     /* size in terms of #512 byte sectors */
-    unsigned int   domain;       /* if a VBD, domain this 'belongs to' */
+    domid_t        domain;       /* if a VBD, domain this 'belongs to' */
 } xen_disk_t;
 
 typedef struct xen_disk_info
index e260c1c033625ad8729114c9605b9f3942a76ae7..4562aa1c49b68dd0087ec2e90c66bf212ed5c3be 100644 (file)
@@ -17,7 +17,7 @@
  * This makes sure that old versions of dom0 tools will stop working in a
  * well-defined way (rather than crashing the machine, for instance).
  */
-#define DOM0_INTERFACE_VERSION   0xAAAA0004
+#define DOM0_INTERFACE_VERSION   0xAAAA0005
 
 
 /*
@@ -51,30 +51,30 @@ typedef struct dom0_createdomain_st
 {
     /* IN parameters. */
     unsigned int memory_kb; 
-    char name[MAX_DOMAIN_NAME];
+    char         name[MAX_DOMAIN_NAME];
     /* OUT parameters. */
-    unsigned int domain; 
+    domid_t      domain; 
 } dom0_createdomain_t;
 
 #define DOM0_STARTDOMAIN      10
 typedef struct dom0_startdomain_st
 {
     /* IN parameters. */
-    unsigned int domain;
+    domid_t domain;
 } dom0_startdomain_t;
 
 #define DOM0_STOPDOMAIN       11
 typedef struct dom0_stopdomain_st
 {
     /* IN parameters. */
-    unsigned int domain;
+    domid_t domain;
 } dom0_stopdomain_t;
 
 #define DOM0_DESTROYDOMAIN     9
 typedef struct dom0_destroydomain_st
 {
     /* IN variables. */
-    unsigned int domain;
+    domid_t      domain;
     int          force;
 } dom0_destroydomain_t;
 
@@ -82,7 +82,7 @@ typedef struct dom0_destroydomain_st
 typedef struct dom0_getmemlist_st
 {
     /* IN variables. */
-    unsigned int  domain;
+    domid_t       domain;
     unsigned long max_pfns;
     void         *buffer;
     /* OUT variables. */
@@ -93,8 +93,8 @@ typedef struct dom0_getmemlist_st
 typedef struct dom0_builddomain_st
 {
     /* IN variables. */
-    unsigned int  domain;
-    unsigned int  num_vifs;
+    domid_t                  domain;
+    unsigned int             num_vifs;
     full_execution_context_t ctxt;
 } dom0_builddomain_t;
 
@@ -109,7 +109,7 @@ typedef struct dom0_bvtctl_st
 typedef struct dom0_adjustdom_st
 {
     /* IN variables. */
-    unsigned int  domain;     /* domain id */
+    domid_t       domain;     /* domain id */
     unsigned long mcu_adv;    /* mcu advance: inverse of weight */
     unsigned long warp;       /* time warp */
     unsigned long warpl;      /* warp limit */
@@ -120,7 +120,7 @@ typedef struct dom0_adjustdom_st
 typedef struct dom0_getdomaininfo_st
 {
     /* IN variables. */
-    unsigned int domain;
+    domid_t domain;
     /* OUT variables. */
     char name[MAX_DOMAIN_NAME];
     int processor;
@@ -141,7 +141,7 @@ typedef struct dom0_getpageframeinfo_st
 {
     /* IN variables. */
     unsigned long pfn;          /* Machine page frame number to query.       */
-    unsigned int domain;        /* To which domain does the frame belong?    */
+    domid_t domain;        /* To which domain does the frame belong?    */
     /* OUT variables. */
     enum { NONE, L1TAB, L2TAB } type; /* Is the page PINNED to a type?       */
 } dom0_getpageframeinfo_t;
@@ -149,7 +149,7 @@ typedef struct dom0_getpageframeinfo_st
 #define DOM0_IOPL             14
 typedef struct dom0_iopl_st
 {
-    unsigned int domain;
+    domid_t domain;
     unsigned int iopl;
 } dom0_iopl_t;
 
@@ -168,7 +168,7 @@ typedef struct dom0_debug_st
 {
     /* IN variables. */
     char opcode;
-    unsigned int domain;
+    domid_t domain;
     int in1, in2, in3, in4;
     /* OUT variables. */
     unsigned int status;
@@ -206,7 +206,7 @@ typedef struct dom0_readconsole_st
 typedef struct dom0_pincpudomain_st
 {
     /* IN variables. */
-    unsigned int domain;
+    domid_t      domain;
     int          cpu;  /* -1 implies unpin */
 } dom0_pincpudomain_t;
 
index 4233d56285daae775c1d67ffcddec3363b46119e..e9b9ce49ed2b600c038d0fada19baa44bce3223a 100644 (file)
 
 #ifndef __ASSEMBLY__
 
+typedef u64 domid_t;
+/* DOMID_SELF is used in certain contexts to refer to oneself. */
+#define DOMID_SELF (~1ULL)
+
 #include "network.h"
 #include "block.h"
 
@@ -334,7 +338,6 @@ typedef struct start_info_st {
     /* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME.     */
     unsigned long nr_pages;      /* total pages allocated to this domain. */
     unsigned long shared_info;   /* MACHINE address of shared info struct.*/
-    unsigned long dom_id;         /* Domain identifier.                    */
     unsigned long flags;          /* SIF_xxx flags.                        */
     /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME).      */
     unsigned long pt_base;       /* VIRTUAL address of page directory.    */
@@ -345,7 +348,7 @@ typedef struct start_info_st {
 
 /* These flags are passed in the 'flags' field of start_info_t. */
 #define SIF_PRIVILEGED 1          /* Is the domain privileged? */
-#define SIF_CONSOLE    2          /* Does the domain own the physical console? */
+#define SIF_INITDOMAIN 2          /* Is thsi the initial control domain? */
 
 /* For use in guest OSes. */
 extern shared_info_t *HYPERVISOR_shared_info;
index 038b49beca2b91d193e9e5447241db63ba8a7dcf..def5a6ee90cbe73c653856eeccc80beffd526b45 100644 (file)
@@ -135,31 +135,26 @@ typedef struct net_rule_st
     u16  src_port_mask;
     u16  dst_port_mask;
     u16  proto;
-    unsigned long src_vif;
-    unsigned long dst_vif;
+    domid_t      src_dom, dst_dom;
+    unsigned int src_idx, dst_idx;
     u16  action;
 } net_rule_t;
 
-#define VIF_DOMAIN_MASK  0xfffff000UL
-#define VIF_DOMAIN_SHIFT 12
-#define VIF_INDEX_MASK   0x00000fffUL
-#define VIF_INDEX_SHIFT  0
-
-/* These are specified in the index if the dom is SPECIAL. */
-#define VIF_SPECIAL      0xfffff000UL
-#define VIF_UNKNOWN_INTERFACE   (VIF_SPECIAL | 0)
-#define VIF_PHYSICAL_INTERFACE  (VIF_SPECIAL | 1)
-#define VIF_ANY_INTERFACE       (VIF_SPECIAL | 2)
+/* These are specified in the 'idx' if the 'dom' is SPECIAL. */
+#define VIF_SPECIAL             (~0ULL)
+#define VIF_UNKNOWN_INTERFACE   0
+#define VIF_PHYSICAL_INTERFACE  1
+#define VIF_ANY_INTERFACE       2
 
 typedef struct vif_query_st
 {
-    unsigned int    domain;
+    domid_t          domain;
     int             *buf;   /* reply buffer -- guest virtual address */
 } vif_query_t;
 
 typedef struct vif_getinfo_st
 {
-    unsigned int        domain;
+    domid_t             domain;
     unsigned int        vif;
 
     /* domain & vif are supplied by dom0, the rest are response fields */
@@ -179,7 +174,7 @@ typedef struct vif_getinfo_st
  */
 typedef struct vif_setparams_st
 {
-    unsigned int        domain;
+    domid_t             domain;
     unsigned int        vif;
     unsigned long       credit_bytes;
     unsigned long       credit_usec;
index df3ecba4ca966dc7e072d3effe5aa5e0b3a7f6d9..a16d1253dee0d6a5939afaca05aeb65cdfa011b4 100644 (file)
@@ -32,43 +32,43 @@ typedef struct _xen_extent {
 
   
 typedef struct _vbd_create { 
-    unsigned     domain;              /* create VBD for this domain */
+    domid_t      domain;              /* create VBD for this domain */
     u16          vdevice;             /* id by which dom will refer to VBD */ 
     u16          mode;                /* OR of { VBD_MODE_R , VBD_MODE_W } */
 } vbd_create_t; 
 
 typedef struct _vbd_grow { 
-    unsigned     domain;              /* domain in question */
+    domid_t      domain;              /* domain in question */
     u16          vdevice;             /* 16 bit id domain refers to VBD as */
     xen_extent_t extent;              /* the extent to add to this VBD */
 } vbd_grow_t; 
 
 typedef struct _vbd_shrink { 
-    unsigned     domain;              /* domain in question */
+    domid_t      domain;              /* domain in question */
     u16          vdevice;             /* 16 bit id domain refers to VBD as */
 } vbd_shrink_t; 
 
 typedef struct _vbd_setextents { 
-    unsigned     domain;              /* domain in question */
+    domid_t      domain;              /* domain in question */
     u16          vdevice;             /* 16 bit id domain refers to VBD as */
     u16          nr_extents;          /* number of extents in the list */
     xen_extent_t *extents;            /* the extents to add to this VBD */
 } vbd_setextents_t; 
 
 typedef struct _vbd_delete {          
-    unsigned     domain;              /* domain in question */
+    domid_t      domain;              /* domain in question */
     u16          vdevice;             /* 16 bit id domain refers to VBD as */
 } vbd_delete_t; 
 
-#define VBD_PROBE_ALL 0xFFFFFFFF
+#define VBD_PROBE_ALL (~0ULL)
 typedef struct _vbd_probe { 
-    unsigned         domain;          /* domain in question or VBD_PROBE_ALL */
+    domid_t          domain;          /* domain in question or VBD_PROBE_ALL */
     xen_disk_info_t  xdi;             /* where's our space for VBD/disk info */
 } vbd_probe_t; 
 
 typedef struct _vbd_info { 
     /* IN variables  */
-    unsigned      domain;             /* domain in question */
+    domid_t       domain;             /* domain in question */
     u16           vdevice;            /* 16 bit id domain refers to VBD as */ 
     u16           maxextents;         /* max # of extents to return info for */
     xen_extent_t *extents;            /* pointer to space for extent list */
index b6f7c402689799d9e8df7c64e2bbfaa3009c4780..e77d4a5ebc91df8d06acc6514ce9248a182a8fd2 100644 (file)
@@ -33,19 +33,17 @@ extern struct mm_struct init_mm;
 #define _HYP_EVENT_NEED_RESCHED 0
 #define _HYP_EVENT_DIE          1
 
-#define PF_DONEFPUINIT  0x1  /* Has the FPU been initialised for this task? */
-#define PF_USEDFPU      0x2  /* Has this task used the FPU since last save? */
-#define PF_GUEST_STTS   0x4  /* Has the guest OS requested 'stts'?          */
-#define PF_CONSTRUCTED  0x8  /* Has the guest OS been fully built yet? */
+#define PF_DONEFPUINIT  0 /* Has the FPU been initialised for this task? */
+#define PF_USEDFPU      1 /* Has this task used the FPU since last save? */
+#define PF_GUEST_STTS   2 /* Has the guest OS requested 'stts'?          */
+#define PF_CONSTRUCTED  3 /* Has the guest OS been fully built yet?      */
+#define PF_IDLETASK     4 /* Is this one of the per-CPU idle domains?    */
+#define PF_PRIVILEGED   5 /* Is this domain privileged?                  */
 
 #include <xeno/vif.h>
 #include <xeno/vbd.h>
 
-/* SMH: replace below when have explicit 'priv' flag or bitmask */
-#define IS_PRIV(_p) ((_p)->domain == 0) 
-
-#define DOMAIN_ID_BITS (16)
-#define MAX_DOMAIN_ID  ((1<<(DOMAIN_ID_BITS))-1)
+#define IS_PRIV(_p) (test_bit(PF_PRIVILEGED, &(_p)->flags))
 
 typedef struct event_channel_st
 {
@@ -92,8 +90,8 @@ struct task_struct
     /*
      * From here on things can be added and shuffled without special attention
      */
-    
-    unsigned int domain;        /* domain id */
+
+    domid_t domain;
 
     spinlock_t       page_list_lock;
     struct list_head page_list;
@@ -185,14 +183,15 @@ struct task_struct
     addr_limit:  KERNEL_DS,      \
     thread:      INIT_THREAD,    \
     prev_task:   &(_t),          \
-    next_task:   &(_t)           \
+    next_task:   &(_t),          \
+    flags:       1<<PF_IDLETASK  \
 }
 
 extern struct task_struct idle0_task;
 
 extern struct task_struct *idle_task[NR_CPUS];
-#define IDLE_DOMAIN_ID   (~0)
-#define is_idle_task(_p) ((_p)->domain == IDLE_DOMAIN_ID)
+#define IDLE_DOMAIN_ID   (~0ULL)
+#define is_idle_task(_p) (test_bit(PF_IDLETASK, &(_p)->flags))
 
 #include <xeno/slab.h>
 
@@ -205,21 +204,21 @@ extern kmem_cache_t *task_struct_cachep;
   atomic_inc(&(_p)->refcnt)
 
 extern struct task_struct *do_createdomain(
-    unsigned int dom_id, unsigned int cpu);
+    domid_t dom_id, unsigned int cpu);
 extern int setup_guestos(
     struct task_struct *p, dom0_createdomain_t *params, unsigned int num_vifs,
     char *data_start, unsigned long data_len, 
     char *cmdline, unsigned long initrd_len);
 extern int final_setup_guestos(struct task_struct *p, dom0_builddomain_t *);
 
-struct task_struct *find_domain_by_id(unsigned int dom);
+struct task_struct *find_domain_by_id(domid_t dom);
 extern void release_task(struct task_struct *);
 extern void __kill_domain(struct task_struct *p);
 extern void kill_domain(void);
 extern void kill_domain_with_errmsg(const char *err);
-extern long kill_other_domain(unsigned int dom, int force);
+extern long kill_other_domain(domid_t dom, int force);
 extern void stop_domain(void);
-extern long stop_other_domain(unsigned int dom);
+extern long stop_other_domain(domid_t dom);
 
 /* arch/process.c */
 void new_thread(struct task_struct *p,
@@ -247,7 +246,7 @@ void schedulers_start(void);
 void sched_add_domain(struct task_struct *p);
 int sched_rem_domain(struct task_struct *p);
 long sched_bvtctl(unsigned long ctx_allow);
-long sched_adjdom(int dom, unsigned long mcu_adv, unsigned long warp, 
+long sched_adjdom(domid_t dom, unsigned long mcu_adv, unsigned long warp, 
                   unsigned long warpl, unsigned long warpu);
 void init_idle_task(void);
 void __wake_up(struct task_struct *p);
@@ -287,7 +286,7 @@ void continue_nonidle_task(void);
 
 /* This hash table is protected by the tasklist_lock. */
 #define TASK_HASH_SIZE 256
-#define TASK_HASH(_id) ((_id)&(TASK_HASH_SIZE-1))
+#define TASK_HASH(_id) ((int)(_id)&(TASK_HASH_SIZE-1))
 extern struct task_struct *task_hash[TASK_HASH_SIZE];
 
 #define REMOVE_LINKS(p) do { \
index 2622a2929e07a4c4114b0e585763314cf2a775d3..0cd2e4dec4ec701462773b11b3cd9782238474e8 100644 (file)
@@ -94,11 +94,11 @@ do {                                                               \
 } while (0)                                                        \
 
 /* vif prototypes */
-net_vif_t *create_net_vif(int domain);
+net_vif_t *create_net_vif(domid_t dom);
 void destroy_net_vif(net_vif_t *vif);
 void unlink_net_vif(net_vif_t *vif);
 net_vif_t *net_get_target_vif(u8 *data, unsigned int len, net_vif_t *src_vif);
-net_vif_t *find_vif_by_id(unsigned long id);
+net_vif_t *find_net_vif(domid_t dom, unsigned int idx);
 
 /*
  * Return values from net_get_target_vif:
index 167e8ce072dd9d3cea00cc28581588cce7082899..48c7a582952bfbc94767c864dbf2fb2f843f265e 100644 (file)
@@ -642,7 +642,7 @@ static void net_rx_action(struct softirq_action *h)
                 skb->data, skb->len, skb->src_vif);
         
         if ( !VIF_LOCAL(skb->dst_vif) )
-            skb->dst_vif = find_vif_by_id(0);
+            skb->dst_vif = find_net_vif(0, 0);
         
         if ( skb->dst_vif != NULL )
         {
index f3725db6c17eb8d2359dc95c4a5c342bb28f8cd2..9eca42de56e800d559420b6f6294e40567f482ee 100644 (file)
@@ -22,6 +22,7 @@ static unsigned char readbuf[1024];
 /* Helpers, implemented at the bottom. */
 u32 getipaddr(const char *buff, unsigned int len);
 u16 antous(const char *buff, int len);
+u64 antoull(const char *buff, int len);
 int anton(const char *buff, int len);
 
 static int vfr_read_proc(char *page, char **start, off_t off,
@@ -141,11 +142,14 @@ static int vfr_write_proc(struct file *file, const char *buffer,
         /* NB. Prefix matches must go first! */
         if (strncmp(&buffer[fs], "src", fl) == 0)
         {
-            op.u.net_rule.src_vif = VIF_ANY_INTERFACE;
+
+            op.u.net_rule.src_dom = VIF_SPECIAL;
+            op.u.net_rule.src_idx = VIF_ANY_INTERFACE;
         }
         else if (strncmp(&buffer[fs], "dst", fl) == 0)
         {
-            op.u.net_rule.dst_vif = VIF_PHYSICAL_INTERFACE;
+            op.u.net_rule.dst_dom = VIF_SPECIAL;
+            op.u.net_rule.dst_idx = VIF_PHYSICAL_INTERFACE;
         }
         else if (strncmp(&buffer[fs], "srcaddr", fl) == 0) 
         {  
@@ -181,19 +185,19 @@ static int vfr_write_proc(struct file *file, const char *buffer,
         }
         else if (strncmp(&buffer[fs], "srcdom", fl) == 0)
         {
-            op.u.net_rule.src_vif |= anton(&buffer[ts], tl)<<VIF_DOMAIN_SHIFT;
+            op.u.net_rule.src_dom = antoull(&buffer[ts], tl);
         }
         else if (strncmp(&buffer[fs], "srcidx", fl) == 0)
         {
-            op.u.net_rule.src_vif |= anton(&buffer[ts], tl);
+            op.u.net_rule.src_idx = anton(&buffer[ts], tl);
         }
         else if (strncmp(&buffer[fs], "dstdom", fl) == 0)
         {
-            op.u.net_rule.dst_vif |= anton(&buffer[ts], tl)<<VIF_DOMAIN_SHIFT;
+            op.u.net_rule.dst_dom = antoull(&buffer[ts], tl);
         }
         else if (strncmp(&buffer[fs], "dstidx", fl) == 0)
         {
-            op.u.net_rule.dst_vif |= anton(&buffer[ts], tl);
+            op.u.net_rule.dst_idx = anton(&buffer[ts], tl);
         }
         else if ( (strncmp(&buffer[fs], "proto", fl) == 0))
         {      
@@ -289,6 +293,23 @@ u16 antous(const char *buff, int len)
     return ret;
 }
 
+u64 antoull(const char *buff, int len)
+{
+    u64 ret;
+    char c;
+
+    ret = 0;
+
+    while ( (len) && ((c = *buff) >= '0') && (c <= '9') )
+    {
+        ret *= 10;
+        ret += c - '0';
+        buff++; len--;
+    }
+
+    return ret;
+}
+
 u32 getipaddr(const char *buff, unsigned int len)
 {
     char c;
index 075acdf5af93664bc401d30f13309468549111c9..29f7c2224fe04a056f624b71d477689b840ea785 100644 (file)
@@ -498,16 +498,20 @@ static int inetdev_notify(struct notifier_block *this,
     else
         goto out;
 
-    op.u.net_rule.src_vif       = idx;
-    op.u.net_rule.dst_vif       = VIF_PHYSICAL_INTERFACE;
+    op.u.net_rule.src_dom       = 0;
+    op.u.net_rule.src_idx       = idx;
+    op.u.net_rule.dst_dom       = VIF_SPECIAL;
+    op.u.net_rule.dst_idx       = VIF_PHYSICAL_INTERFACE;
     op.u.net_rule.src_addr      = ntohl(ifa->ifa_address);
     op.u.net_rule.src_addr_mask = ~0UL;
     op.u.net_rule.dst_addr      = 0;
     op.u.net_rule.dst_addr_mask = 0;
     (void)HYPERVISOR_network_op(&op);
     
-    op.u.net_rule.src_vif       = VIF_ANY_INTERFACE;
-    op.u.net_rule.dst_vif       = idx;
+    op.u.net_rule.src_dom       = VIF_SPECIAL;
+    op.u.net_rule.src_idx       = VIF_ANY_INTERFACE;
+    op.u.net_rule.dst_dom       = 0;
+    op.u.net_rule.dst_idx       = idx;
     op.u.net_rule.src_addr      = 0;
     op.u.net_rule.src_addr_mask = 0;    
     op.u.net_rule.dst_addr      = ntohl(ifa->ifa_address);
@@ -539,7 +543,7 @@ int __init init_module(void)
      * addresses. All other domains have a privileged "parent" to do this for
      * them at start of day.
      */
-    if ( start_info.dom_id == 0 )
+    if ( start_info.flags & SIF_INITDOMAIN )
         (void)register_inetaddr_notifier(&notifier_inetdev);
 
     err = request_irq(NET_IRQ, network_interrupt, 
@@ -619,7 +623,7 @@ static void cleanup_module(void)
         kfree(dev);
     }
 
-    if ( start_info.dom_id == 0 )
+    if ( start_info.flags & SIF_INITDOMAIN )
         (void)unregister_inetaddr_notifier(&notifier_inetdev);
 }
 
index d9934d1f5b33f5541532979076a85429f8d448a5..361815a58bc9770e425845578da16fd92908b01c 100644 (file)
@@ -9,8 +9,8 @@
 #include <asm/desc.h>
 
 /* Offsets in start_info structure */
-#define MOD_START 20
-#define MOD_LEN   24
+#define MOD_START 16
+#define MOD_LEN   20
                 
 startup_32:
         cld
index ed6dbbc3c504fe9419a19ab77fed87bab06db907..fc0164045f07a3141e68b313452022b9a4a99a6e 100644 (file)
@@ -30,7 +30,7 @@ asmlinkage int sys_iopl(unsigned int new_io_pl)
 
     /* Force the change at ring 0. */
     op.cmd           = DOM0_IOPL;
-    op.u.iopl.domain = start_info.dom_id;
+    op.u.iopl.domain = DOMID_SELF;
     op.u.iopl.iopl   = new_io_pl;
     HYPERVISOR_dom0_op(&op);
 
index ff64bccd4c26acd281ad2eced018cbf7af067302..78820a8b15ecb655cbbb5ed93cefd7bc699fd47b 100644 (file)
@@ -394,7 +394,7 @@ void __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
     {
         dom0_op_t op;
         op.cmd           = DOM0_IOPL;
-        op.u.iopl.domain = start_info.dom_id;
+        op.u.iopl.domain = DOMID_SELF;
         op.u.iopl.iopl   = next->io_pl;
         queue_multicall1(__HYPERVISOR_dom0_op, (unsigned long)&op);
     }
index be70b26ce3c2c9b5a6e3d52ee4acbc8fac8f9efb..4856250089e0abee5f2d45b4331e2bb072f97f63 100644 (file)
@@ -318,14 +318,14 @@ void __init setup_arch(char **cmdline_p)
     {
         dom0_op_t op;
         op.cmd           = DOM0_IOPL;
-        op.u.iopl.domain = start_info.dom_id;
+        op.u.iopl.domain = DOMID_SELF;
         op.u.iopl.iopl   = 1;
         if( HYPERVISOR_dom0_op(&op) != 0 )
             panic("Unable to obtain IOPL, despite being SIF_PRIVILEGED");
         current->thread.io_pl = 1;
     }
 
-    if(start_info.flags & SIF_CONSOLE)
+    if ( start_info.flags & SIF_INITDOMAIN )
     {
         if( !(start_info.flags & SIF_PRIVILEGED) )
             panic("Xen granted us console access but not privileged status");
index bf43b6a99be1fb39acd6a60be91ab986fcc1eff1..875a216fb06fc53d7841ed6eb9431485610a024e 100644 (file)
@@ -297,7 +297,7 @@ void do_settimeofday(struct timeval *tv)
 {
     struct timeval newtv;
     
-    if ( !independent_wallclock && (start_info.dom_id != 0) )
+    if ( !independent_wallclock && !(start_info.flags & SIF_INITDOMAIN) )
         return;
     
     write_lock_irq(&xtime_lock);
@@ -333,7 +333,7 @@ void do_settimeofday(struct timeval *tv)
     last_update_from_xen = 0;
 
 #ifdef CONFIG_XENO_PRIV
-    if ( start_info.dom_id == 0 )
+    if ( start_info.flags & SIF_INITDOMAIN )
     {
         dom0_op_t op;
         last_update_to_rtc = last_update_to_xen = 0;
@@ -445,7 +445,8 @@ static inline void do_timer_interrupt(int irq, void *dev_id,
     }
 
 #ifdef CONFIG_XENO_PRIV
-       if ( (start_info.dom_id == 0) && ((time_status & STA_UNSYNC) == 0) )
+       if ( (start_info.flags & SIF_INITDOMAIN) && 
+         ((time_status & STA_UNSYNC) == 0) )
     {
         /* Send synchronised time to Xen approximately every minute. */
         if ( xtime.tv_sec > (last_update_to_xen + 60) )
index 6d6461dfb9cf1e08f85145fdb6a7ad43e9586a51..4afd25cd42688f09caab0135f5376307a8e6c5a1 100644 (file)
@@ -1,6 +1,9 @@
 /* xenolinux/include/asm-xeno/keyboard.h */
 /* Portions copyright (c) 2003 James Scott, Intel Research Cambridge */
-/* Talks to hypervisor to get PS/2 keyboard and mouse events, and send keyboard and mouse commands */
+/*
+ * Talks to hypervisor to get PS/2 keyboard and mouse events, and send keyboard
+ * and mouse commands
+ */
 
 /*  Based on:
  *  linux/include/asm-i386/keyboard.h
@@ -50,7 +53,7 @@ extern unsigned char pckbd_sysrq_xlate[128];
 
 static inline int xen_kbd_controller_present ()
 {
-    return start_info.flags & SIF_CONSOLE;
+    return start_info.flags & SIF_INITDOMAIN;
 }
 
 /* resource allocation */